C ++实例化新对象导致相同的"这个"指针

时间:2015-09-20 04:07:48

标签: c++ pointers memory

我最近一直在使用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具有相同的价值。他们为什么不这样做?

1 个答案:

答案 0 :(得分:4)

您错过了copy constructor。在您的情况下,您正在实例化对象的基于堆栈的实例,并且它基本上memcpy d进入您的vector。可能堆栈实例始终位于同一地址,因此您具有相同的parent指针值。

另一个问题是,如果/ vector需要重新分配以构建更大的内部数组,那么所有parent值当然不会自动更新为新的(并且正确)价值。为避免这种情况,您需要提前在reserve上调用vector以获得对您的案例有意义的任何值,以便数组永远不会被重新分配。

没关系;复制构造函数也会处理这个问题。