c++ - C++中指向指针动态数组的指针

标签 c++ arrays pointers

想关闭动态指针时一直运气不好。为什么应用程序在堆缓冲区结束后写入内存?我怎样才能关闭我的阵列?

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;
}

最佳答案

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

关于c++ - C++中指向指针动态数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30976384/

相关文章:

c++ - 使用数组地址获取尾后指针

c - 验证以下观点:在处理二叉树时最好使用指向指针的指针

c - 解释一下输出。它正在打印每个字母表的下一个字母表

c++ - 在这种情况下,魔法数字可以吗?

c++ - 为什么堆栈上对齐的整数之间有 8 字节填充 "0xcc"? C++ 32 位 Windows 7

javascript - Javascript当遍历数组时,网页卡住/崩溃

c - 如何更新 X86 中 double 组中的所有元素?

java - C 代码到 Java——字符操作

c++ - 如何在 C++11 中使用 <regex>

javascript - 平面 JSON 展开为具有多个父级的层次结构作为字符串