没有调用构造函数的 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)中使用了一个较旧的 bo​​ost 库,根据 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 的赋值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥执行时没有执行基类的构造函数?

为啥我的构造函数没有被调用?

错误:在 C++ 中没有用于调用构造函数的匹配函数

为啥看似明确的类型提示构造函数调用存在“没有匹配的 ctor”?

java怎么调用带参数构造函数

C++调用父类的构造函数规则