我最近一直在使用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
,使其为适合您的情况的任何值,以便数组永远不会被重新分配。
无所谓;复制构造函数也会处理这个问题。