Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向对象的指针数组的内存结构(可视化)_C++ - Fatal编程技术网

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制作这个框架吗?