#include <memory>
struct A
{
std::shared_ptr<A> GetSelf()
{
return std::shared_ptr<A>(this);
}
};
//自定义删除器
void DeleteIntPtr(int* p)
{
delete p;
}
//自我封装一个make_shard_array让shard_ptr支持数组
template<typename T>
std::shared_ptr<T> make_shard_array(size_t size)
{
return std::shared_ptr<T>(new T[size], std::default_delete<T[]>);
}
//通过派生enable_shared_from_this,并且使用shared_from_this()方法来返回
//this指针
//原因是:enable_shared_from_this类中有一个weak_ptr,这个weak_ptr是用来观测this指针的,调用shared_from_this()
//方法时,内部会调用weak_ptr的lock方法。
class B :public std::enable_shared_from_this<B>
{
public:
std::shared_ptr<B> GetSelf()
{
return shared_from_this();
}
};
int main()
{
//1.初始化 使用make_shared<T>或者reset方法初始化shared_ptr指针
std::shared_ptr<int> p(new int(1));
std::shared_ptr<int> p2 = p;
std::shared_ptr<int> ptr;
ptr.reset(new int(1));
//优先使用make_shared来构造智能指针
//2.不能直接将一个裸指针直接赋值给一个智能指针
//std::shared_ptr<int> p = new int(1);
//3.获取原始指针
//std::shared_ptr<int> ptr(new int(1));
//int* p = ptr.get();
//4.指定删除器
//std::shared_ptr<int> p(new int, DeleteIntPtr);
//删除器也可以是一个lambda
//std::shared_ptr<int> p(new int, [](int* p) {delete p; });
/*当shard_ptr管理动态数组时,需要指定删除器,shard_ptr的默认删除器不支持数组对象*/
//使用shard_ptr需要注意的问题:
//1.不要使用原始指针初始化多个shared_ptr
//int* ptr = new int;
//std::shared_ptr<int> p1(ptr);
//std::shared_ptr<int> p2(ptr);//p1和p2的use_count返回值仍然是1
//2 通过shared_from_this()返回this指针,不要将this指针作为shared_ptr返回出来
//原因是用同一个this构造了两个智能指针,它们之间没有关系
//正确的做法是:让目标类通过派生std::enable_shared_from_this<T>类,然后使用
//shared_from_this来返回this的shared_ptr
//3.避免循环引用
std::shared_ptr<B> sp1(new B);
std::shared_ptr<B> sp2 = sp1->GetSelf();
return 0;
}