当前位置:   article > 正文

C++智能指针之shared _ptr、weak_ptr、unique_ptr_c++ shared_ptr unique_ptr weak_ptr

c++ shared_ptr unique_ptr weak_ptr

一、class shared_ptr

       shared_ptr具有共享式拥有的概念。即多个shared_ptr可以指向相同的对象,该对象和其相关资源会在“最后一个引用被销毁”时释放。

1、shared_ptr的初始化:

(1)直接使用初始化

  1. shared_ptr<string> str(new string("name"));
  2. shared_ptr<string> str2{ new string("name") };
  3. //但是不能以以下方式声明一个shared_ptr:
  4. //shared_ptr<string> strErr = new string("name"); // 错误

(2)使用make_shared

shared_ptr<string> str3 = make_shared<string>("name");

       使用这种方式比较快,也比较安全,因为它使用一次而不是二次分配:一次针对对象,另外一次针对“shared_ptr”用以控制对象的shared data。

(3)使用reset

  1. shared_ptr<string> str4;
  2. str4.reset(new string("name"));
  3. // str4 = new string("name"); // 错误

(4)像使用普通指针一样使用shared_ptr

  1. (*str4)[0] = 'N';
  2. str4->replace(0,1, "K");

2、定义一个deleter

(1)普通的delerer

  1. shared_ptr<string> pt(new string("nam"), [](string * p) {
  2. cout << "delete " << *p << endl;
  3. delete p;
  4. });

       以上例子使用lambda定义了一个自己的deleter,ptr会在其最末一个拥有者被销毁时执行者lambda函数,由此就可以推出我们可以在shared_ptr别销毁时执行我们自己的函数。实际上要想释放pt则可以给该变量赋值为nullptr或者用另一个对象给它赋值。

(2)对于数组的deleter

       注意,shared_ptr提供的默认deleter调用的是delete。不是delete{},这意味着只有当shared_ptr拥有“由new建立起来的单一对象”,默认的delete才可以使用,但是对于数组来说却不适用,所以当shared_ptr是new了一个数组出来的时候必须使用自己定义的delete。

  1. shared_ptr<int> p(new int[10], [](int *p) {
  2. delete[] p;
  3. });

当然也可以使用unique_ptr提供的辅助函数作为delete:

shared_ptr<int> p1(new int[10], default_delete<int[]>());

       然而请注意,shared_ptr和unique_ptr处理deleter的方式还是不大一样,例如unique_ptr允许你只传递对应的元素作为template实参,但是这对shared_ptr就不行。

  1. unique_ptr<int[]> p(new int[10]);
  2. //shared_ptr<int[]> pErr(new int[10]); // 错误
  3. //此外,对于unique_ptr,必须明确给予第二个template实参,指出你自己的delete:
  4. unique_ptr<int, void(*)(int*)> pu(new int[10], [](int* p) {
  5. delete[] p;
  6. });

       同时,应该注意,shared_ptr不提用operator[],而对于unique_ptr,它有一个针对数组的偏特化版本,该版本提供operator[]取代operator*和operator->。之所以有如此差异是因为unique_ptr在效能和弹性上进行了优化。  

<
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/206244
推荐阅读
相关标签
  

闽ICP备14008679号