我在一些对象的堆上创建了一个2D数组:
步骤(1)
Obj **arr = new Obj *[n];
for (int i=0;i<n;i++)
{
arr[i] = new Obj[n];
}
//所以这会创建2D arr [n] [n] ...然后当我删除它时:
步骤(2)
for (int i=0;i<n;i++)
{
delete [] arr[i];
}
delete [] arr;
所以我仍然不确定这个删除是做什么的。它是否运行Obj的析构函数并标记操作系统告诉它现在是可用内存。
现在我真的不明白的是,当我再次执行Step(1)时(删除后),我将这些对象初始化为奇怪的值,但这不会在我第一次执行时发生(全部零初始化)。我第一次感到幸运吗?
答案 0 :(得分:0)
你的例子没有Obj的声明。
答案 1 :(得分:0)
AFAIK,无论您重复删除和修改多少次,以下代码都不会为您提供奇怪的值。
#include <iostream>
using namespace std;
class Foo
{
public:
Foo(): val(-2) { cout << "ctor" << endl; }
~Foo() { cout << "dtor: " << val << endl; }
private:
int val;
};
int main()
{
Foo **arr = new Foo *[2];
for (int i = 0; i < 2; ++i)
arr[i] = new Foo[2](); // <- for builtin type, () is required to initialized to zero.
for (int i = 0; i < 2; ++i)
delete [] arr[i];
delete [] arr;
return 0;
}
相关帖子:Operator new initializes memory to zero
关于删除指针后指针会发生什么情况,请参阅此帖子:C - What happens to an array of pointers when the array is freed?