一个 c++指针问题

2019-06-02 10:56:26 +08:00
 Steiner

我动态生成了一个二维数组,但我只用它的 1~n 行

int **D = new int *[n + 1];
    
    for (int i = 1; i <= n; i++)
    {
        D[i] = new int[i];
    }

在 delete 这个二维数组时,我遇到了异常

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

出现异常:

Trace/breakpoint trap

调试时发现在第一次循环就报错了,把 i 改为 0,2 都不行 有人知道是为什么吗?

2939 次点击
所在节点    问与答
9 条回复
May725
2019-06-02 11:19:23 +08:00
没觉着代码有问题呀,这中间有其他操作,导致指针丢了吧
JeffKing
2019-06-02 11:22:21 +08:00
写了初始化 赋值 和销毁的代码,没有重现你的问题。怀疑是你中间赋值或者使用时越界了。
kljsandjb
2019-06-02 11:25:52 +08:00
刚运行了一遍,没发现错误…
ershierdu
2019-06-02 11:26:36 +08:00
把这两段代码贴进 main 函数,最开始加了一行 int n = 2;
没有重现
Steiner
2019-06-02 11:44:10 +08:00
我的编辑器是 vscode,编译器是用的 gcc
hsyu53
2019-06-02 13:47:50 +08:00
动态规划那里,内层循环数组访问越界了
catror
2019-06-02 16:00:33 +08:00
new int[i+1]
ershierdu
2019-06-02 16:04:54 +08:00
for (int i = 1; i <= n; i++)
{
D[i] = new int[i]; // D[i]是一个长度 为 i 的数组,即 D[i][0]到 D[i][i-1]
}

... ...

for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
cin >> D[i][j]; // j 的最大值为 i,即会出现 D[i][i]的情况,越界了
}
}



------------------------------------------------------
后面的代码我没继续看了,不确定还有没有问题
yucao
2019-06-02 16:12:15 +08:00
```cpp
int **D = new int *[n + 1];

for (int i = 1; i <= n; i++)
{
D[i] = new int[i];
}

//...

for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
cin >> D[i][j];//瞎搞嘛...
}
}
```

这里已经越界产生 ub 了,后面 delete 时候无法定位你的 new 出来的长度引发异常

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/569945

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX