C++ std::shared_ptr : aliasing constructor && owner_before()

aliasing constructor

C++标准库中的共享指针shared_ptr的构造函数中有个比较特殊的用法:aliasing constructor(别名构造器)
原型如下:
  template <class U> shared_ptr (const shared_ptr<U>& x, element_type* p) noexcept;
这里需要传入一个共享指针对象,和另外一个指针;对该构造函数,官网的解释如下:
  The object does not own p, and will not manage its storage. Instead, it co-owns x's managed object and counts as one additional use of x. It will also delete x's pointer on release (and not p).
  It can be used to point to members of objects that are already managed.
翻译过来就是:共享指针并不拥有p,也不会管理它的内存;而是和x共同拥有x管理的对象,并且增加x的一个计数,同时负责x指向对象的内存管理;这种构造形式一般用来指向一个已经被智能指针管理的对象的成员;

简单来说就是,aliasing constructor构造方式,构造了一个拥有x(负责x的生存管理周期),但是指向p(访问p的数据)的共享指针;
官网针对这个还有更多的解释,如下图:(http://www.cplusplus.com/reference/memory/shared_ptr/)

C++ std::shared_ptr : aliasing constructor && owner_before()

 上图中,提到了两个概念,一个是stored pointer 存储指针(访问该对象的数据),一个是owned pointer 所有者指针(负责该对象的生存周期管理);

实际应用的举例如下:
  struct C{int * data};
  std::shared_ptr<C> obj (new C); //obj是C类型对象的一个共享指针
  std::shared_ptr<int> p9 (obj, obj->data); //p9是obj的一个共享指针,但指向的是C对象的data数据成员
  cout << *p9 << endl; //访问的是obj->data
  cout << p9->get() << endl; //访问的是obj->data
这里,访问p9存储的数据时,实际上是访问的obj->data,也就是p9是obj->data的一个stored pointer,不负责obj->data的生存周期管理;

而p9实际上管理的是obj的生存周期,也就是p9是obj的owned pointer;

aliasing constructor这种用法实际上是为了解决一种场景:一个智能指针有可能指向了另一个智能指针中的某一部分,但又要保证这两个智能指针销毁时,只对那个被指的对象完整地析构一次,而不是两个指针分别析构一次。

owner_before()

理解了aliasing constructor之后,shared_pointer::owner_before()就更好理解了;(参考https://www.zhihu.com/question/24816143)

在标准库的shared_ptr中,operator<,比较的是stored pointer,因此上面举例的那种情况,p9和obj两个shared_ptr是不相等的;而owner_before()是基于owner pointer的比较,因此p9和obj是相等的;

shared_ptr作为map的key时,用的就是owner_before()而不是operator<,否则可能不满足我们实际的使用需求;

注意,boost库中的shared_ptr和标准库中的share_ptr实现有所不同;boost库中operator<和owner_before()都是比较的owner pointer;

 

原文链接: https://www.cnblogs.com/youxue-helloworld/p/12993810.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++ std::shared_ptr : aliasing constructor && owner_before()

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/351743

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午7:02
下一篇 2023年3月2日 上午7:02

相关推荐