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

How are arrays stored and deleted in memory?

本文关键字:删除 数组 存储 内存      更新时间:2023-10-16

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

步骤 (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) 时(在我删除后),我将这些对象初始化为奇怪的值,但这在我第一次这样做时并没有发生(全部为零初始化)。我第一次走运吗?

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;
}

相关文章:算子新初始化内存为零

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

您的示例缺少 Obj 的声明。

  • new[] 分配内存并调用每个元素的构造函数
  • 如果构造函数不改变内存,您将看到一些随机值 - 可能是零。
  • delete[] 调用先前使用 new[] 分配的每个元素的析构函数,最后解除分配内存。
  • 在调试编译中,内存可能会被一些指示释放的字节填满。
  • 在释放后立即执行 new[] 可能会显示指标字节。