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

一个 c++指针问题

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

    我动态生成了一个二维数组,但我只用它的 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   ·   实用小工具   ·   5404 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:33 · PVG 16:33 · LAX 00:33 · JFK 03:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.