C++ 实例化新对象会导致指针相同"this"

C++ Instantiating new object leads to same "this" pointer

本文关键字:指针 this 新对象 实例化 对象 C++      更新时间:2023-10-16

我最近一直在使用c++,所以我可能错过了一些简单的东西。

我基本上有以下代码:

struct MyStruct
{
    struct MyStruct *parent;
    MyStruct();
}
MyStruct::MyStruct()
{
    parent = this;
}

之后在我的main函数中,我有一个for循环如下:

std::vector<MyStruct> Collection;
Collection.reserve(100);
for (int i = 0; i < 100; ++i)
{
    Collection.push_back(MyStruct());
}

当我运行我的程序时,我希望得到一个MyStruct元素的向量,每个元素都有一个唯一的parent指针。相反,我得到一个向量,其中每个元素的parent点初始化为相同的内存地址。

为什么parent指针对我所有的对象是相同的?当我打开gdb并输入

(gdb) print Collection[0].parent
$1 = (Point *) 0x7fffffffdcd0
(gdb) print &Collection[0]
$2 = (Point *) 0x60b010

我希望$1和$2具有相同的值。为什么不呢?

您缺少一个复制构造函数。在您的例子中,您正在实例化对象的基于堆栈的实例,并且它实质上是将memcpy d变为vector。可能堆栈实例总是在同一个地址,这就是为什么你有相同的parent指针值。

另一个问题是,如果/当vector需要重新分配以制作更大的内部数组时,所有parent值当然不会自动更新为新的(正确的)值。为了避免这种情况,您需要提前在vector上调用reserve,使其为适合您的情况的任何值,以便数组永远不会被重新分配。

无所谓;复制构造函数也会处理这个问题。