c++ - 将元素插入容器 : copy constructor messes up pointers

标签 c++ c++11 containers copy-constructor

我的问题是默认复制构造。弄乱了我的指针。

简化版:

  • 我有一个带有默认复制构造的A类。

  • A 有 2 个成员对象:BC

  • B 有一个指向 C 的指针。

情况:

  • 我将 A 存储在 std::vector 中:vector.emplace_back(A(...));

  • emplace_back 这样做:

    • 创建 A(设置B指向C的指针等)

    • 复制 A 到 vector 中。 (默认复制点击率:按复制)

    • 摧毁“起源”A。

. 结果:

  • 存储有一个A,它有一个B,它有一个指向 A 的C 的指针。它不再存在了。

简单的解决方案是:

  • A 中会有指向 BC 的指针>

但这不是很好,因为当 A 拥有它的 B 和 C 并且 B 和 C 与 A 共享生命周期时,为什么 A 应该有指针。

问题:

  • 有没有比在 A 中使用指针更好的方法?

  • 或者有没有比搞乱复制构造函数实现更简单的方法?

  • 我认为 emplace 构造“就地”,那么为什么它需要复制点击率?

最佳答案

Isn't there a better way than having pointers in A?

是的,有。此外,我看不出在 A 中使用指针如何解决问题。

一个解决方案是为 A 编写一个用户定义的复制构造函数,它将更新复制成员的指针。

Or isn't there a simplier way than messing with copy constructor implementations?

不,复制构造函数(也许可以说?)是更新成员的成员指针的最简单方法。

I thought that emplace constructs "in-place"

确实如此。

so why does it need a copy ctr?

一般不会。

在这种情况下,它确实需要移动或复制构造函数,因为您向它传递了一个临时对象。 vector 中的对象是“就地”构建的,方法是使用移动(或复制,如果不可移动)构造函数,并将临时对象作为参数。

相反,您可以将 A 的构造函数的参数直接传递给 emplace_back,这样就不会涉及临时变量。

请注意,就地构建对象不会阻止 vector 元素被复制,除非您预先保留内存以便不会发生重新分配。

关于c++ - 将元素插入容器 : copy constructor messes up pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41325263/

相关文章:

c++ - main 中的 Void 并防止 Dos 程序死亡

具有线程安全队列的 C++11 事件循环

c++ - 覆盖代理类 c++ 的 std::swap

即使使用 -it 运行 Docker 容器也会退出

google-cloud-platform - 未定义容器的 GCP 实例模板

c++ - 为什么 C++ 链接器在构建期间需要库文件,即使我是动态链接的?

c++ - 传递带有args的函数并将值返回给另一个函数

c++ - 打印未初始化的引用给出 1. 为什么?

c++ - 消息总线的最佳容器

c++ - ListView控件中的LVN_ITEMCHANGED优化