【发布时间】:2016-12-25 23:31:14
【问题描述】:
我的问题是 默认的复制结构。弄乱了我的指针。
简化版:
我有一个
A类,其默认 复制结构。A有 2 个成员对象:B和C。B有一个指向C的指针。
情况:
我将
A存储在std::vector:vector.emplace_back(A(...));-
emplace_back 这样做:
创建 A(设置B指向C的指针等)
复制 A 到向量中。 (默认复制ctr:按值复制)
摧毁“起源”A.
。 结果:
- 存储有一个
A,它有一个B,它有一个指向旧 A 的C 的指针。它不再存在了。
简单的解决方案是:
- 在
A中会有指向B和C的指针
但这不是很好,因为当 A 拥有 B 和 C 并且 B 和 C 与 A 共享生命周期时,为什么要拥有指针。
问题:
难道没有比在 A 中使用指针更好的方法吗?
或者没有比搞乱复制构造函数实现更简单的方法吗?
我以为 emplace 是“就地”构造的,那为什么还需要一个拷贝 ctr 呢?
【问题讨论】:
-
我不明白问题是什么。也许你会提供相关的示例代码来看看实际发生了什么......根据你的描述,
C似乎应该有一个构造函数来获取正确的B对象的地址,A应该有合适的复制构造函数/copy 分配以正确设置包含的C对象上的指针。 -
我删除了我的答案,因为它是构造对象 in-place 的提示,但没有解决弄乱指针的主要问题。您需要发布一些示例代码或 MCVE 以获得完整的解决方案。
-
一个 emplace 可以触发重新分配,从而复制或移动元素
-
顺便说一句:这是使用 emplace 的错误方式——基本上你是在调用 push_back。您应该只将构建 A 所需的参数 oass 到 emplace_back,然后它可以就地构建 A,而不需要临时的。
-
一些具有所需输出与实际输出的示例代码(即使抛出编译器错误)将有助于回答您的问题。很多用户只喜欢看代码,不喜欢看段落
标签: c++ c++11 containers copy-constructor