[英]Proper way to delete an array of pointers
我有一个指针数组(我通过调用new ptr*[size]
)。 所有这些指针都指向一个也放在堆上的对象。
删除数组和所有新的ptr的正确方法是什么?
这就是我现在所做的:
for (int i = 0; i < size; i++) delete array[i];
delete[] array; // Not sure since this double deletes array[0]
这是否符合我的想法?
谢谢
分配有new
每个指针都会获得相应的delete
。 用new []
分配的每个指针都得到一个相应的delete []
。 这真的是你需要知道的。 当然,当你有一个包含动态分配指针的动态分配数组时,释放必须以相反的顺序发生。
因此,正确的成语将是......
int main()
{
int **container = new int*[n];
for(int i = 0; i < n; ++i)
container[i] = new int[size];
// ... and to deallocate...
for(int i = 0; i < n; ++i)
delete [] container[i];
delete [] container;
}
然后当然我说“停止这样做”并建议你使用std::array
或std::vector
(模板类型将是unique_ptr<int>
)。
是的,那就是您认为应该做的。 由于您为每个元素执行了new
,因此必须delete
每个元素。 既然你为整个数组做了new[]
,你需要delete[]
整个数组。
正如@djechlin在评论中正确地说的那样,还没有足够的信息继续下去,但我假设您之前的代码是这样的:
int** array = new int*[5];
for (int i = 0; i < 5; i++) {
array[i] = new int;
}
请注意,数组实际上不是数组类型。 它是“指向int的指针”,它指向的指针数组是用new[]
分配的。 这就是你需要delete[]
它的原因。
是。 首先,你必须释放数组中每个指针指向的对象,然后你必须释放数组本身。 以该顺序。 如果颠倒顺序,则不会引用对象,并会泄漏大量内存。
是的,首先删除数组元素指向的每个对象,然后删除指针数组本身。 如果你想检查你的内存管理,你可以使用像valgrind这样的工具,他们将能够发现大多数错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.