shared_ptr别名构造函数

时间:2013-09-30 19:17:26

标签: c++ c++11 shared-ptr

关于关注shared_ptr构造函数的问题:

template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );

我是否正确如果r是使用用户提供的删除器创建的,则别名shared_ptr知道这一点。因此,如果别名shared_ptr是组中的最后一个,并且(当超出范围时)销毁最初由r管理的资源,它将使用该用户提供的删除器吗?

2 个答案:

答案 0 :(得分:5)

示例:

#include <iostream>
#include <iomanip>

struct some_type
{
    int i;
};

void my_deleter(some_type* p)
{
std::cout << "my_deleter called!" << std::endl;
    delete p;
}

#include <memory>
int main()
{
    std::shared_ptr<int> pm;

    {
        // Note: better use make_shared
        auto x = new some_type;
        // create a shared_ptr that owns x and a deleter
        std::shared_ptr<some_type> r(x, &my_deleter);
        std::cout << r.use_count() << std::endl;

        // share ownership of x and the deleter with pm
        pm = std::shared_ptr<int>(r, &r->i);
        std::cout << r.use_count() << std::endl;

        // r gets destroyed
    }
    std::cout << pm.use_count() << std::endl;
    std::cout << "get_deleter == 0? " << std::boolalpha
              << (nullptr == std::get_deleter<decltype(&my_deleter)>(pm))
              << std::endl;
}

输出:

1
2
1
get_deleter == 0? false
my_deleter called!

N.B。我无法使用自由函数my_deleter编译此示例,对于免费get_deleter函数存在一些转换错误(尝试从void*转换为函数指针输入static_cast)。


别名ctor: [util.smartptr.shared.const] / 13-14

template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept;
     

13 效果:构建一个shared_ptr实例,用p存储r共享所有权

     

14 后置条件: get() == p && use_count() == r.use_count()

使用用户提供的删除器的Ctor: [util.smartptr.shared.const] / 9

  

模板shared_ptr(Y * p,D d);

     

效果:构造拥有对象shared_ptr和删除者p的{​​{1}}对象。

析构函数: [util.smartptr.shared.dest] / 1

  

〜shared_ptr的();

     

1 效果:

     
      
  • 如果d 为空或与另一个*this实例(shared_ptr)共享所有权,则无副作用。
  •   
  • 否则,如果use_count() > 1 拥有对象*this和删除者p,则会调用d
  •   
  • 否则,d(p) 拥有指针*this,并调用p
  •   

组合这些(让我们跳过赋值运算符):

  • delete p实例shared_ptr 拥有对象和删除者。
  • 别名ctor允许新的r实例shared_ptr共享所有权(即对象和删除者)。
  • 当调用此新实例的dtor(或赋值运算符)时,
    • 如果r,则无效。
    • 否则,此实例拥有 use_count > 1指向删除器(如果有)的对象,并将使用此删除器(如果存在)或指向对象的r

答案 1 :(得分:0)

是的,因为删除器存储在shared_ptr的计数器中('pn'成员if (userGroup == 1) { divUserGroup1.Visible = true; } else if (userGroup == 2) { divUserGroup2.Visible = true; } ),并且别名实际上共享计数器。