cpp
class Person{
public:
Person() = default;
~Person(){
};
std::shared_ptr<Person> getPtr(){
return std::shared_ptr<Person>(this);
}
};
int main() {
std::shared_ptr<Person> person = std::make_shared<Person>();
std::shared_ptr<Person> person1 = person->getPtr();
std::cout << "person.use_count() = " << person.use_count() << std::endl;
std::cout << "person1.use_count() = " << person1.use_count() << std::endl;
return 0;
}
上面这个代码运行,会出错⚠️
因为getPtr
内部通过原生的this
指针去构造了一个智能指针并返回,导致两个智能指针person
和person1
同时管理一个对象,但是各自的引用计数都是1,导致析构两次,出错。
如果想要在类的内部返回一个这个类的智能指针应该先继承enable_shared_from_this
,然后再返回shared_from_this()
,就可以得到一个智能指针,并且这个智能指针与管理这个对象的智能指针共享引用计数。
例子如下:
cpp
#include <iostream>
class Person:public std::enable_shared_from_this<Person>{
public:
Person() = default;
~Person(){
};
std::shared_ptr<Person> getPtr(){
return shared_from_this();
}
};
int main() {
std::shared_ptr<Person> person = std::make_shared<Person>();
std::shared_ptr<Person> person1 = person->getPtr();
std::cout << "person.use_count() = " << person.use_count() << std::endl;
std::cout << "person1.use_count() = " << person1.use_count() << std::endl;
return 0;
}