3

我有一个指针数组(我通过调用创建new ptr*[size])。所有这些指针都指向一个也放在堆上的对象。

删除数组和所有新 ptr 的正确方法是什么?

这就是我现在所做的:

for (int i = 0; i < size; i++) delete array[i];
delete[] array; // Not sure since this double deletes array[0]

这会做我认为应该做的吗?

谢谢

4

4 回答 4

12

每个分配的指针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::arrayor std::vector(模板类型为unique_ptr<int>)。

于 2012-12-18T23:42:37.317 回答
2

是的,这是你认为应该做的。既然你new对每个元素都做了,你就必须对delete每个元素。而且由于您new[]对整个数组进行了操作,因此您需要对delete[]整个数组进行操作。

正如@djechlin 在评论中正确所说的那样,没有足够的信息继续下去,但我假设您之前的代码是这样的:

int** array = new int*[5];
for (int i = 0; i < 5; i++) {
  array[i] = new int;
}

请注意,数组实际上不是数组类型。它是一个“指向 int 指针的指针”,它指向的指针数组是用new[]. 这就是为什么你需要delete[]它。

于 2012-12-18T23:38:34.207 回答
1

是的。首先你必须释放数组中每个指针指向的对象,然后你必须释放数组本身。以该顺序。如果您颠倒顺序,您将没有对对象的引用,并且会泄漏大量内存。

于 2012-12-18T23:44:34.960 回答
0

是的,首先删除数组元素指向的每个对象,然后删除指针数组本身。如果要检查内存管理,可以使用valgrind之类的工具,它们将能够发现大多数错误。

于 2012-12-18T23:42:15.417 回答