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

标签 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 元素的 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/

相关文章:

c++ - 指向 QMainWindow 改变的指针

c++ - 在 des ecb 中加密数据

c++ - 错误 : request for member (maybe you meant to use '->' ? ) 已经使用 '->'

c++ - SDL_Surface 指针在两个类之间传递

wpf - 立即将图像加载到内存中

c - 函数返回后本地内存地址是否有效?

c++ - 我应该在哪里重新实现 QApplication::notify 功能?

c - 二维数组和指针有什么关系?

java - 多个 Java 引用会使使用的内存加倍吗?

c++ - 为什么 cmake 找不到编译器 cl