2015-06-22 2 views
0

Мне не повезло с динамическими указателями, когда я хочу его закрыть. почему приложение записано в память после завершения кучи буфера? как я могу закрыть свой массив?Указатель на указатель динамического массива в C++

int main() 
{ 
    . 
    . 
    int **W; 
    W = new int* [n]; 
    for (int i=1; i <= n; i++) 
     W[i] = new int[n]; 
    . 
    . 
    . 
    ast(n,W); 

    for(int i = 1; i <=n ; i++) 
    { 
     delete W[i]; 
    } 
    delete W; 
    getch(); 
} 
void ast (int n,int **W) 
{ 
    int **D; 
    D = new int* [n]; 
    for (int i=0; i < n; i++) 
     D[i] = new int[n]; 

    D=W; 
    for (int k=1;k<=n;k++) 
     for (int i=1;i<=n;i++) 
      for (int j=1;j<=n;j++) 
       D[i][j]=min(D[i][j],D[i][k]+D[k][j]); 
    . 
    . 
    for(int i = 1; i <=n ; i++) 
    { 
     delete D[i]; 
    } 
    delete D; 
} 
+0

W являются от 0 до п-1 вместо 1 п. –

+0

Можете ли вы объяснить больше? – amIllusionist

+1

Вы должны переходить от 0 до n-1 вместо 1 в n. Еще лучше, используйте std :: vector. –

ответ

2

Допустимый диапазон индексов массива с N элементов [0, N-1]. Таким образом, вместо того, чтобы, например, эта петля

for (int i=1; i <= n; i++) 
     ^^^^ ^^^^^^ 

вы должны написать

for (int i = 0; i < n; i++) 

Как вы использовали оператор new [] вы должны использовать оператор delete [] Так вместо

for(int i = 1; i <=n ; i++) 
{ 
    delete W[i]; 
} 

и

delete W; 

вы должны написать

for (int i = 0; i < n; i++) 
{ 
    delete [] W[i]; 
} 

и

delete []W; 

Функция ast не имеет смысла, потому что кроме других ошибок имеет место утечка памяти. Сначала вы выделить память и присвоить его адрес указателя D, а затем вы перезаписать это значение указателя индексов

void ast (int n,int **W) 
{ 
    int **D; 
    D = new int* [n]; 
    for (int i=0; i < n; i++) 
     D[i] = new int[n]; 

    D=W; // <== ??? 
Смежные вопросы