我有一个指向数组的指针数组。 我已经创建了一个硬编码的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或其他模板,这只是因为我有兴趣学习这个。 最大的批评赞赏。
答案 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}}悬空。