如何在内存中存储和删除数组
How are arrays stored and deleted in memory?
我在一些对象的堆上做了一个二维数组:
步骤 (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[] 可能会显示指标字节。
相关文章:
- 你能帮我解决删除数组 c++ 中重复值的挑战吗?
- 删除[i] 数组和删除数组 [i] 之间的区别
- 如何实现删除数组的功能?
- 删除数组 c++ 崩溃问题
- 如何删除数组列表中的元素
- C++删除数组只会解除分配第一项
- 删除数组成员的更好方法是什么?
- 如何使用 deleteEntry 函数 c++ 删除数组中的单个字符串
- 删除数组中所有出现的数字 C++
- C++ 删除数组时检测到堆损坏
- 不允许删除数组的一部分,为什么
- 如何删除数组中第一次出现的值
- 当我删除数组时,指针在哪里?指向数组的指针与数组中的元素之间的区别
- 尝试用C 中的空地址(而非null)删除数组指针
- 为什么 std::remove 不删除数组的最后一个元素
- 如何使用c++删除数组中的一些值
- 仅删除数组的第一个元素
- 删除数组时断言失败
- 如何并行删除数组中的零值
- 访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组