0

我在一些对象的堆上创建了一个二维数组:

步骤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 的析构函数并标记操作系统,告诉它这是现在可用的内存。

现在我真的不明白的是,当我再次执行步骤(1)时(在我删除之后),我将这些对象初始化为奇怪的值,但是我第一次这样做时并没有发生这种情况(全部为零初始化) . 我第一次运气好吗?

4

2 回答 2

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 将内存初始化为零

至于删除指针后会发生什么,请看这篇文章:C - 当数组被释放时指针数组会发生什么?

于 2013-11-14T23:40:21.360 回答
0

您的示例缺少 Obj 的声明。

  • new[] 分配内存并调用每个元素的构造函数
  • 如果构造函数不改变内存,你会看到一些随机值——可能是零。
  • delete[] 调用之前用 new[] 分配的每个元素的析构函数,最后释放内存。
  • 在调试编译中,内存可能会填充一些指示释放的字节。
  • 在释放后立即执行 new[] 可能会显示指示字节。
于 2013-11-14T23:32:32.753 回答