gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:46:44 25 4
gpt4 key购买 nike

我最近一直在使用 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 元素的 vector ,每个元素都有一个唯一的 parent 指针。相反,我得到一个 vector ,其中每个元素的 parent 点初始化为 相同 内存地址。

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

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

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

最佳答案

您缺少一个 copy constructor .在您的情况下,您正在实例化对象的基于堆栈的实例,并且它本质上是 memcpyd 到您的 vector 中。可能堆栈实例总是在相同的地址,因此你有相同的 parent 指针值。

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

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

关于C++ 实例化新对象导致相同的 "this"指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32675699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com