删除动态分配的锯齿状数组

时间:2011-01-12 07:34:12

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

我有一个指向数组的指针数组。 我已经创建了一个硬编码的int数组(检查下面的'数组'),我想将它插入指针数组(检查下面的'bar'),据我所知,它仍然是一个指针数组,指向整数数组。

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

我想我的编译器会在这一点上做出更好的析构函数,但我对我做错了什么很感兴趣。终端窗口只是抛出一个巨大的内存映射;谷歌搜索和搜索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或其他模板,这只是因为我有兴趣学习这个。 最大的批评赞赏。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

问题在于调用myfunc。在该函数中,您将替换您的类认为它拥有的指针(bar[0])。然后,您的obj析构函数会尝试在delete[] array[]main上运行bar[0],这可能会导致您的崩溃离开原始{{1}} 1}}悬空。