0

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

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

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

4

2 回答 2

3

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

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

于 2011-01-12T07:42:50.637 回答
1

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

于 2011-01-12T07:41:57.750 回答