C++ 指向对象的指针数组的内存结构(可视化)
例如,当我以以下方式分配内存时,我可以想象这种情况:C++ 指向对象的指针数组的内存结构(可视化),c++,C++,例如,当我以以下方式分配内存时,我可以想象这种情况: Position* arr1 = new Position[5]; Position在我的程序中是一个类,它用x和y值描述位置点 堆栈上会有一个指针,指向堆上数组“arr1”的第一个元素(位置对象),因此它看起来像这样: 如果我要创建一个指针数组,它会是什么样子呢?例如: Position** arr2 = new Position* [2]; arr[0] = new Position(3, 7); // Constructs a p
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);
在我的第二个示例中,内存中存储的所有指针和对象都在哪里?堆栈上是否有指针指向堆上的指针,然后这些指针指向堆上的对象或其他对象
另外,如果我要删除[]arr2代码>,对象将保留在内存中的什么位置
谢谢。数组arr2的指针将位于堆栈上。其他指针arr2[0]、arr2[1]等将位于堆上,这些指针将指向堆上的不同位置
new
创建的每个对象都在堆上。因此,在您的示例中,两个指针的数组将位于堆上arr2
作为局部变量将位于堆栈上
Position
对象由new
单独分配,它们位于各自独立的堆块中。它们需要分别被delete
d。否则,它们将留在堆上。对象不能在堆栈和堆之间移动。(尽管C++11提供了std::move
,但这实际上是一种特殊的所有权转移;它不会神奇地将堆地址转换为堆栈地址。)
delete[]arr2
会将对象留在内存中。由于指针数组不拥有引用的对象,因此此代码不要求销毁间接引用的对象
您应该始终避免直接使用new
和delete
来支持容器对象(std::vector
或std::array
在这里可以工作),或者使用智能指针,例如unique_ptr
和shared_ptr您有一个自动变量,arrR2
指针对象。其余的在免费商店里。如果只delete[]arr2
,将释放指针的内存,而不是指针指向的对象
arr2 ---+ +---------------------------------+
| | |
| | |
+----> [Position*, Position*] |
| | | |
| | +----> [9, 6] |
| v |
| [3, 7] |
+---------------------------------+
您的图表将有一个额外的间接层次。因此,将myArray
替换为arr2
,具有arr2[0]
和arr2[1]
。然后,仍然在堆上,从arr2[0]
到位置值
,从arr2[1]
到另一个位置
值绘制另一个箭头
如果使用delete[]arr2
,这些值将保留在内存中最初分配的任何位置 你是在建议改变他的设计。他的图表与他的代码(第一个示例)匹配。我指出了如何修改它来表示第二个示例。我可以问一下,您如何用ascii制作这个框架吗?