我有一个指针数组(我通过调用创建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
or 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之类的工具,它们将能够发现大多数错误。