gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:19:09 50 4
gpt4 key购买 nike

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

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/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com