- 通过引用计数来实现的。
- 一般来讲,应尽量用 make_shared来初始化及赋值。
- 根据2,this指针会非常麻烦。比如,我要把this 放到一个vector<shared_ptr> 中去。解决方法是 enable_shared_from_this
这样,就会变成共享一个shared_ptr了。(但需要注意:那个类的实例只能是以shared_ptr的形式来存放。
下面的代码引自cppreference.
struct Good: std::enable_shared_from_this<Good>
{
std::shared_ptr<Good> getptr() {
return shared_from_this();
}
};
struct Bad
{
std::shared_ptr<Bad> getptr() {
return std::shared_ptr<Bad>(this);
}
~Bad() { std::cout << "Bad::~Bad() called\n"; }
};
int TestEnablemain()
{
std::shared_ptr<Good> gp1 = std::make_shared<Good>();
std::shared_ptr<Good> gp2 = gp1->getptr();
std::cout << "gp2.use_count() = " << gp2.use_count() << '\n';
try {
Good not_so_good;
std::shared_ptr<Good> gp1 = not_so_good.getptr();
} catch(std::bad_weak_ptr& e) {
std::cout << e.what() << '\n';
}
std::shared_ptr<Bad> bp1 = std::make_shared<Bad>();
std::shared_ptr<Bad> bp2 = bp1->getptr();
std::cout << "bp2.use_count() = " << bp2.use_count() << '\n';
return 0;
}
- 使用shared_ptr 进行强转,需要小心将原始指针释放掉。
int fu(shared_ptr<int> intPtr){
return 0;
}
int main(){
int *a = new int();
*a = 1;
fu(shared_ptr<int>(a));
free(a);
return 0;
}