在联合体中使用std::shared_ptr

5
我正在实现一个"variant"类,它必须具有最小的内存占用并使用共享指针机制来存储一些对象。
为此,我想在类中创建一个包含所有变量类型的union,其中包括一些shared_ptr's。
operator=和复制构造函数必须更改variant的数据类型,因此切换到union中的另一个成员。当切换到shared_ptr时,应将其重置为null而不删除/释放指针。有没有办法做到这一点?
当然,还有其他实现方式,但在我的情况下它们通常更加复杂、不太安全或更消耗内存。欢迎任何建议。
谢谢!

如果“重置为null”并不删除所拥有的对象,那么你手头的就不是一个shared pointer。 - Kerrek SB
2
联合(union)并不是任何 C++ 代码的好解决方案。你可以尝试/使用 boost::variant - Bryan Chen
@galinette 存在这样的方法。它被称为析构函数。如果你要用 double 类型替换共用体中的 shared_ptr,那么你必须先析构 shared_ptr。 - James Kanze
1
如果“重置为null”会删除所拥有的对象,而不考虑引用计数,则您拥有的就不是一个共享指针。 - James Kanze
@James Kanze:是的,我明白了,实际上我正在寻找相反的情况:用shared_ptr替换double。您的评论让我想到了我正在寻找在union shared_ptr上调用构造函数。我能用placement new来做到这一点吗? - galinette
显示剩余4条评论
1个回答

3

将指针重置为null是不够的;我所知道的std::shared_ptr实现还有一个指向引用计数的指针,这个也必须被删除。

你需要跟踪联合体中当前的内容,并在类型更改时使用显式调用析构函数和放置new进行构造(以及在构造函数和析构函数中)。


“重置为null”是指将整个shared_ptr底层机制重置为有效状态的空指针,但你说得对。我正在寻找placement new,谢谢。 - galinette

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接