没有调用构造函数的 boost::intrusive_ptr 的赋值?
Posted
技术标签:
【中文标题】没有调用构造函数的 boost::intrusive_ptr 的赋值?【英文标题】:Assignment to boost::intrusive_ptr without constructor called? 【发布时间】:2020-01-31 11:46:43 【问题描述】:以这种方式使用赋值来提升::intrusive_ptr 是否安全?
class B : public A ...;
boost::intrusive_ptr<A> a = new B;
我在这个项目(1.36)中使用了一个较旧的 boost 库,根据 boost 文档,我想知道为什么会编译,因为这个赋值应该等同于成员函数“swap”,它似乎需要另一个侵入性 ptr 但不是原始的指针。是否调用了 intrusive_ptr 的构造函数,从而调用了计数器的增量? (发生了崩溃(损坏的大小与 prev_size)和堆栈跟踪信息将我引导到此指针)
在我使用的软件的所有其他地方:
class B : public A ...;
boost::intrusive_ptr<A> a;
a = boost::intrusive_ptr<A>(new B);
我以为几年前我读到你必须使用第二个版本,但我再也找不到这个文本了。或者是 boost::intrusive_ptr 同时改变了,所以第一个例子是有效的?
【问题讨论】:
您显示的第一个代码 sn-p 没有赋值。T x = ...;
是一个初始化,根本不涉及operator=
。
【参考方案1】:
感谢 Max 的评论,我将回答我的问题以关闭它。 是保存和编译,因为
X a = new B;
根本不调用复制操作符,只调用复制构造函数,甚至
B * p = new B;
boost::intrusive_ptr<A> i;
i = p;
会工作,因为有 3 个作业(我监督过)
根据 boost doc (https://www.boost.org/doc/libs/1_60_0/libs/smart_ptr/intrusive_ptr.html):
intrusive_ptr & operator=(intrusive_ptr const & r);
template<class Y> intrusive_ptr & operator=(intrusive_ptr<Y> const & r);
intrusive_ptr & operator=(T * r);
// Effects: Equivalent to
intrusive_ptr(r).swap(*this)
【讨论】:
以上是关于没有调用构造函数的 boost::intrusive_ptr 的赋值?的主要内容,如果未能解决你的问题,请参考以下文章