如何在内存中存储和删除数组?

时间:2013-11-14 23:13:03

标签: c++ arrays memory heap

我在一些对象的堆上创建了一个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)时(删除后),我将这些对象初始化为奇怪的值,但这不会在我第一次执行时发生(全部零初始化)。我第一次感到幸运吗?

2 个答案:

答案 0 :(得分:0)

你的例子没有Obj的声明。

  • new []分配内存并调用每个元素的构造函数
  • 如果构造函数没有改变内存,你会看到一些随机值 - 可能是零。
  • delete []调用先前用new []分配的每个元素的析构函数,最后释放内存。
  • 在调试编译中,内存可能会填充一些表示释放的字节。
  • 在重新分配后立即执行new []可能会显示指示字节。

答案 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?