目录
一、概念
enable_shared_from_this是一个模板类,定义于#include<memory>中,其原型为:template< class T > class enable_shared_from_this;
std::enable_shared_from_this 能让一个对象(使用std::shared_ptr<A> pool_obj管理对象obj)安全地生成其他额外的 std::shared_ptr 实例(obj1, obj2, ... ) ,它们与 pool_ojb 共享对象 obj 的所有权。
若一个类 T 继承 std::enable_shared_from_this<T> ,则会为该类 T 提供成员函数: shared_from_this 。 当 T 类型对象 t 被一个为名为 pt 的 std::shared_ptr<T> 类对象管理时,调用 T::shared_from_this 成员函数,将会返回一个新的 std::shared_ptr<T> 对象,它与 pt 共享 t 的所有权。
二、shared_ptr的问题
1.shared_ptr实现原理
shared_ptr 从 _Ptr_base 继承了 element_type 和 _Ref_count_base 类型的两个成员变量。
template<class _Ty>class _Ptr_base
{
private:
element_type * _Ptr
{
ptr
}; // 指向资源的指针
_Ref_count_base * _Rep
{
ptr
}; // 指向资源引用计数的指针
};
_Ref_count_base 中定义了原子类型的变量 _Uses 和 _Weaks,它们分别记录资源的引用个数和资源观察者的个数。
class __declspec(novtable) _Ref_count_base
{
private:
_Atomic_counter_t _Uses;//记录资源引用个数
_Atomic_counter_t _Weaks;//记录观察者个数
}
当要使用 shared_ptr 管理同一资源,调用 shared_ptr 的构造函数和拷贝构造函数是不一样的,它们虽然使得不同 shared_ptr 指向同一资源,但管理引用计数资源的方式却不一样。
调用构造函数方式
无法通过原指针增加共享指针的统一引用计数(两个非共享的shared_ptr指向同一个对象