Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 增压共享ptr:操作员=和重置之间的差异?_C++_Boost_Shared Ptr - Fatal编程技术网

C++ 增压共享ptr:操作员=和重置之间的差异?

C++ 增压共享ptr:操作员=和重置之间的差异?,c++,boost,shared-ptr,C++,Boost,Shared Ptr,下面两段代码之间有什么区别吗?它们中有哪一个比另一个更好 运算符= boost::shared_ptr<Blah> foo; // foo.ptr should be NULL foo = boost::shared_ptr<Blah>(new Blah()); // Involves creation and copy of a shared_ptr? boost::shared_ptr<Blah> foo; // foo.ptr should be NU

下面两段代码之间有什么区别吗?它们中有哪一个比另一个更好

运算符=

boost::shared_ptr<Blah> foo; // foo.ptr should be NULL
foo = boost::shared_ptr<Blah>(new Blah()); // Involves creation and copy of a shared_ptr?
boost::shared_ptr<Blah> foo; // foo.ptr should be NULL
foo.reset(new Blah()); // foo.ptr should point now to a new Blah object
boost::shared\u ptr foo;//foo.ptr应为空
foo=boost::shared_ptr(新Blah());//涉及创建和复制共享的ptr?
重置

boost::shared_ptr<Blah> foo; // foo.ptr should be NULL
foo = boost::shared_ptr<Blah>(new Blah()); // Involves creation and copy of a shared_ptr?
boost::shared_ptr<Blah> foo; // foo.ptr should be NULL
foo.reset(new Blah()); // foo.ptr should point now to a new Blah object
boost::shared\u ptr foo;//foo.ptr应为空
foo.reset(新的Blah());//ptr现在应该指向一个新的Blah对象
注意:我需要定义shared_ptr,然后在另一行中设置它,因为我在一段代码中使用它,如:

boost::shared_ptr<Blah> foo;
try
{
  foo.reset...
}
foo...
boost::shared_ptr foo;
尝试
{
重置。。。
}
福。。。

运算符=
共享的ptr
分配给
共享的ptr
,而
重置
使
共享的ptr
拥有指针的所有权。因此,基本上,你所发布的示例之间没有区别。也就是说,您应该不喜欢这两种方法,而只使用:


operator=
将另一个
shared\u ptr
作为参数,从而创建另一个副本(并增加引用计数),而
reset()
将指针和可选的删除器作为参数,从而在当前副本的基础上创建一个新的共享ptr

重置相当于(可能实现为)

operator=
很可能实现为:

shared_ptr& operator=( shared_ptr const& other )
{
   shared_ptr shared(other);
   swap(other);
   return *this;
}
这两个函数的相似之处在于,它们释放了对它们已经包含的内容(如果有的话)的控制,并管理一个不同的指针。

foo.reset(p)
被定义为等同于
共享的ptr(p).swap(foo)

赋值在逻辑上等同于复制和交换,并且可能以这种方式实现。So
foo=shared_ptr(p)
相当于foo.swap(shared_ptr(p))。如果编译器今天过得很糟糕,可能会有一个额外的副本

因此,在你给出的例子中,我认为它们之间没有太多选择。在其他情况下,这可能很重要。但是reset对静态类型的
p
执行与模板构造函数相同的基于模板的捕获,因此就获得正确的删除程序而言,我们将介绍您


赋值的主要用途是复制以前存在的
共享\u ptr
,以共享同一对象的所有权。当然,它在从临时变量赋值时也可以正常工作,如果您查看不同的
reset
重载,它们会反映不同的构造函数。因此,我怀疑您可以通过任何一种方式实现相同的目标。

赋值操作符从现有对象创建一个新的共享对象,增加引用计数

CSharedObj& CSharedObj::operator=(CSharedObj& r) noexcept
{ 
     if(*this != r){
        //detach from the previous ownership
        if(0 == dec()) delete m_pControlObj;
        //attach to the new control object and increment the reference count
        r.inc();
        m_pControlObj = r.m_pControlObj;
    }
    return *this;
}
而重置调用并不创建新的共享对象,而是创建一个新的所有权-附加到新的基础指针对象(通过控制对象)


reset
也被重载以获取另一个共享指针,在这种情况下,它相当于赋值。现金牛:您能解释一下行
shared\u ptr shared(其他)的作用吗
在您的
操作符=
实现中,您是否可以证明您的评论是首选共享的?使用
新建
和初始化
共享ptr
是一个两步过程。理论上,创建对象可能会成功,但初始化
共享\u ptr
可能会失败,在这种情况下,除非您明确处理这种情况,否则将导致内存泄漏
make_shared
会帮你解决这个问题。根据研究,它也更快。
CSharedObj& CSharedObj::operator=(CSharedObj& r) noexcept
{ 
     if(*this != r){
        //detach from the previous ownership
        if(0 == dec()) delete m_pControlObj;
        //attach to the new control object and increment the reference count
        r.inc();
        m_pControlObj = r.m_pControlObj;
    }
    return *this;
}
void CSharedObj::reset(Ptr pointee) noexcept
{
   //check if this is a last reference-detach from the previous ownership
   if(0==dec()) delete m_pControlObj;
   // create the ownership over the new pointee (refCnt = 1)
   m_pControlObj = new (std::nothrow) CControlObj(pointee);
}