【问题标题】:Deleting a dynamically allocated jagged array删除动态分配的交错数组
【发布时间】:2011-06-07 16:03:09
【问题描述】:

我有一个指向整数数组的指针数组。 我已经制作了一个硬编码的整数数组(检查下面的“数组”),我想将它插入到指针数组中(检查下面的“栏”),据我所知,它仍然是一个指针数组指向整数数组。

它编译得很好;没有警告。 它运行良好;并关闭罚款; 直到至少,我在析构函数中引入了当前被注释掉的删除语句。

我想我的编译器在这一点上会成为一个更好的析构函数,但我对我做错了什么感兴趣。终端窗口只是抛出一个巨大的内存映射;谷歌搜索和搜索 SO 并没有太大帮助。

class foo {
    public:
    int **bar;
    int aSize;

    //CONSTRUCTOR
    foo(int aSize) {
        this->aSize = aSize;
        bar = new int*[aSize];
        for (int i=0;i<aSize;i++) {
            bar[i] = new int[aSize + i];
            for (int j=0;j<(aSize + i);j++) {
                bar[i][j] = 0;
            }
        }
        }
    void myfunc(int *pointer) {
        bar[0] = pointer;
    }
    ~foo() {
        for (int i=0;i<aSize;i++) {
            //delete[] bar[i];
        }
        delete[] bar;
    }
};
int main() {
    foo *obj = new foo(5);

    int array[] = {1,2,3,4};

    obj->myfunc(array);

    delete obj;
    return 0;
};

我知道我可能做过一些悲惨的事情;我只是还不知道它是什么。 我不使用 STL 或其他模板是有原因的,只是因为我有兴趣学习这个。 最大的批评表示赞赏。

【问题讨论】:

    标签: c++ pointers memory delete-operator jagged-arrays


    【解决方案1】:

    myfunc 函数接收一个指针,然后将bar[0] 设置为该内存地址。在您的示例代码中,您将array 的地址传递给它,这是一个自动(堆栈)变量。然后析构函数尝试delete[] bar[0],它指向一个堆栈变量。这完全是undefined behavior,也是您的程序崩溃的原因。您不能delete[] 堆栈数组。您只能delete[] 使用new[] 分配的数组。

    另外,myfunc 函数总是会泄漏内存,因为bar[0] 指向堆分配的数组。当您将bar 设置为不同的内存地址而没有先delete[] 之前的地址时,您正在泄漏内存。

    【讨论】:

    • 对,废话,显而易见的答案......该死的炎热天气。谢谢。将 int i=0 更改为 i=1 修复了它。
    • 天气炎热? I envy you.
    • 你只能delete[]使用new[]分配的数组,不能new。轻微的挑剔。
    【解决方案2】:

    问题是调用myfunc。在该函数中,您将替换您的类认为它拥有的指针 (bar[0])。您的obj 析构函数随后将尝试在main 中的array[] 上运行delete[],这可能会导致您的崩溃并且使您原来的bar[0] 悬空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 2018-09-17
      • 2011-08-15
      • 2018-05-01
      相关资源
      最近更新 更多