使用share_ptr管理自定义类型存在的问题
#include <memory>
#include <iostream>
class B
{
public:
void func() {
// 1.使用this裸指针进行共享指针的初始化
std::shared_ptr<B> local_sp_b(this);
// 2.local_sp_b限定在作用域内,计数为1
std::cout << local_sp_b.use_count() << std::endl;
// 3.退出作用域后local_sp_b计数减1->变成0->自动回收指向的内存
}
};
int main()
{
std::shared_ptr<B> spb(new B());
spb->func();
// 4.这里开始spb指向的内存已经被释放,虽然spb的计数为1
std::cout << spb.use_count() << std::endl;
spb->func(); // 5.内存崩溃
return 0;
}
可以看到 虽然local_sp_b和spb都是指向同一内存,但是他们的引用计数是分别独立的, 这种情况会造成内存崩溃
使用c++11引入的std::enable_shared_from_this ( boost库的也行) 解决此问题
#include <memory>
#include <iostream>
class A : public std::enable_shared_from_this<A>
{
public:
void func() {
std::shared_ptr<A> local_sp_a = shared_from_this();
// 1.引用计数为2,说明local_sp_a和spa共享引用计数
std::cout << local_sp_a.use_count() << std::endl;
// 2.退出作用域时引用计数为1, 不会释放指向的内存
}
};
int main()
{
std::shared_ptr<A> spa(new A());
spa->func();
// 3.引用计数为1,说明local_sp_a和spa共享引用计数
std::cout << spa.use_count() << std::endl;
return 0;
}