【发布时间】:2011-11-03 19:34:35
【问题描述】:
在我的班级中,我有一个动态分配的指针数组。我的声明:
array = new Elem* [size];
for (int i = 0; i < size; i++) {
array[i] = NULL;
}
所以有一个指针数组,其中每个指针指向一个简单的 Elem 结构体。
主要问题是,我应该如何正确地释放数组。如果我只使用:
for (int i = 0; i < size; i++) {
delete array[i];
}
Valgrind 报告了 1 个未释放的块,该块被追溯到 'array = new Elem* [size];' 的行状态。
另一方面,如果我添加到前面的代码:
delete array;
我认为是正确的,valgrind 报告了 0 个未释放的块,这是完美的,但它报告了
Mismatched free() / delete / delete []
正好在“删除数组;”所在的行是。我也试过'delete []array',但那也只是“1个未释放的块”!如果有人能以正确的方式向我解释,将不胜感激。
编辑: 所以使用:
for (int i = 0; i < size; i++) {
delete array[i];
}
delete[] array;
可能工作正常。它在我的一个班级(我有两个类似的班级)中工作,另一个仍然报告一些小泄漏。我认为这只是某个地方的一个小错误,但 valgrind 仍然指向
array = new Elem* [size];
站着。
EDIT2: 我也解决了这个问题,感谢您的辛苦贡献!
【问题讨论】:
-
它在哪里说未释放的块得到了分配?
-
让您的生活更轻松:删除以上所有内容,并使用 Boost ptr_vector。
-
我知道这并不能回答您的问题,但是您是否有某些原因不能使用 std::vector
来大大简化内存管理? -
确实有,这是一项学校作业,我们不允许使用它,可能关键是要学习如何正确地做到这一点。
-
@aGr:在这种情况下,“家庭作业”标签是否合适?它也可能阻止其他人推动矢量角度。 :)
标签: c++ memory-leaks valgrind