例如,我可以通过以下方式分配内存时的情况:
Position* arr1 = new Position[5];
Position 是我程序中的一个类,它描述了具有 x 和 y 值的位置点。
堆栈上会有一个指向堆上数组“arr1”的第一个元素(位置对象)的指针,所以它看起来像这样:
如果我要创建一个指针数组,它会是什么样子?例如:
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;
,对象将保留在内存中的什么地方?
谢谢。
最佳答案
new
创建的每个对象都在堆上。所以在你的例子中,两个指针的数组将在堆上。arr2
,作为局部变量,将在堆栈上。Position
对象由new
单独分配,位于它们自己单独的堆 block 中。它们需要单独删除
。否则,它们将保留在堆上。对象不能在栈和堆之间移动。 (虽然 C++11 提供了std::move
,但这实际上是一种特殊的所有权转移;它不会神奇地将堆地址变成堆栈地址。)delete [] arr2
会将对象留在内存中。由于指针数组不拥有引用的对象,因此此代码不会要求销毁间接引用的对象。
您应该始终避免直接使用 new
和 delete
以支持容器对象(std::vector
或 std::array
可以在这里工作)或智能指针,例如 unique_ptr
和 shared_ptr
。
关于c++ - 对象指针数组的内存结构(可视化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8936997/