一个 c++指针问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Steiner
V2EX    问与答

一个 c++指针问题

  •  
  •   Steiner 2019-06-02 10:56:26 +08:00 3749 次点击
    这是一个创建于 2411 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我动态生成了一个二维数组,但我只用它的 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 都不行 有人知道是为什么吗?

    第 1 条附言    2019-06-02 11:42:24 +08:00
    ```c++
    #include <iostream>
    #include <algorithm>

    using namespace std;

    int main()
    {
    int n;
    cin >> n;

    int **D = new int *[n + 1];

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

    //记录来源
    char **from = new char*[n+1];
    for (int i = 1; i <= n; i++)
    {
    from[i] = new char[i];
    }

    for (int i = 1; i <= n; i++)
    {
    for (int j = 1; j <= i; j++)
    {
    cin >> D[i][j];
    }
    }
    for (int i = 1; i <= n; i++)
    {
    for (int j = 1; j <= i; j++)
    {
    from[i][j] = '*';
    }
    }

    //动态规划,求解数字三角
    for (int i = n - 1; i >= 1; i--)
    {
    for (int j = 1; j <= i; j++)
    {
    if(D[i + 1][j] > D[i + 1][j + 1])
    {
    D[i][j] = D[i + 1][j] + D[i][j];
    from[i][j] = 'l';
    }
    else
    {
    D[i][j] = D[i + 1][j + 1] + D[i][j];
    from[i][j] = 'r';
    }

    }
    }

    cout<<D[1][1]<<endl;
    int i(1), j(1);
    while(i<n && j<=i)
    {
    cout<<from[i][j]<<" ";
    if(from[i][j] == 'l')
    i++;
    else if(from[i][j] == 'r')
    i++,j++;

    }

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

    for (int i = 1; i <= n; i++)
    {
    delete[] from[i];
    }
    delete[] from;
    system("pause");
    return 0;
    }
    ```
    附上完整代码
    9 条回复    2019-06-02 16:12:15 +08:00
    May725
        1
    May725  
       2019-06-02 11:19:23 +08:00 via iPhone
    没觉着代码有问题呀,这中间有其他操作,导致指针丢了吧
    JeffKing
        2
    JeffKing  
       2019-06-02 11:22:21 +08:00 via iPhone
    写了初始化 赋值 和销毁的代码,没有重现你的问题。怀疑是你中间赋值或者使用时越界了。
    kljsandjb
        3
    kljsandjb  
       2019-06-02 11:25:52 +08:00 via iPhone
    刚运行了一遍,没发现错误…
    ershierdu
        4
    ershierdu  
       2019-06-02 11:26:36 +08:00
    把这两段代码贴进 main 函数,最开始加了一行 int n = 2;
    没有重现
    Steiner
        5
    Steiner  
    OP
       2019-06-02 11:44:10 +08:00
    我的编辑器是 vscode,编译器是用的 gcc
    hsyu53
        6
    hsyu53  
       2019-06-02 13:47:50 +08:00 via iPhone
    动态规划那里,内层循环数组访问越界了
    catror
        7
    catror  
       2019-06-02 16:00:33 +08:00 via Android
    new int[i+1]
    ershierdu
        8
    ershierdu  
       2019-06-02 16:04:54 +08:00   1
    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
        9
    yucao  
       2019-06-02 16:12:15 +08:00   1
    ```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 出来的长度引发异常
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     931 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 20ms UTC 20:44 PVG 04:44 LAX 12:44 JFK 15:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86