c++ - 对象指针数组的内存结构(可视化)

标签 c++

例如,我可以通过以下方式分配内存时的情况:

Position* arr1 = new Position[5];

Position 是我程序中的一个类,它描述了具有 x 和 y 值的位置点。

堆栈上会有一个指向堆上数组“arr1”的第一个元素(位置对象)的指针,所以它看起来像这样:

enter image description here

如果我要创建一个指针数组,它会是什么样子?例如:

Position** arr2 = new Position* [2];

arr[0] = new Position(3, 7); // Constructs a point with x and y values.
arr[1] = new Position(9,6);

在我的第二个例子中,内存中存储的所有指针和对象都在哪里?堆栈上是否有指针指向堆上的指针,然后指向堆上的对象或其他东西?

此外,如果我要delete [] arr2;,对象将保留在内存中的什么地方?

谢谢。

最佳答案

  1. new 创建的每个对象都在堆上。所以在你的例子中,两个指针的数组将在堆上。 arr2,作为局部变量,将在堆栈上。
  2. Position 对象由new 单独分配,位于它们自己单独的堆 block 中。它们需要单独删除。否则,它们将保留在堆上。对象不能在栈和堆之间移动。 (虽然 C++11 提供了 std::move,但这实际上是一种特殊的所有权转移;它不会神奇地将堆地址变成堆栈地址。)
  3. delete [] arr2 会将对象留在内存中。由于指针数组不拥有引用的对象,因此此代码不会要求销毁间接引用的对象。

您应该始终避免直接使用 newdelete 以支持容器对象(std::vectorstd::array 可以在这里工作)或智能指针,例如 unique_ptrshared_ptr

关于c++ - 对象指针数组的内存结构(可视化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8936997/

相关文章:

c++ - 成员函数的 pragma GCC 毒语法

Windows 和 Unix 系统的 C++ 套接字

c++ - 模板类特化 enable_if 和默认值

c++ - 如何在 codelite 中运行多个程序

C++如何使用相同的函数两次使用不同的名称和变量的不同名称

c++ - 有没有办法在 C++ 中显示/打印变量/成员的属性

c++ - 字符串的数据类型是什么?

c++ - 在使用 boost::assign::list_of 时声明时不能被非常量表达式初始化

c++ - 使用 videowriter opencv 的视频大小为 0 字节

c++ - 接口(interface)上的引用作为参数