2015-06-22 93 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到n-1而不是1到n的这个值。 –

+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; // <== ???