#include <iostream>
#include <memory>
class A {
public:
std::shared_ptr<A> p;
~A() { std::cout << "A's destructor\n"; }
};
int main() {
std::shared_ptr<A> x = std::make_shared<A>();
x->p=x;
return 0;
}
A对象内的智能指针p是x拷贝构造的,所以控制块的强引用计数变为2
main结束后x析构,强引用计数减1,最后是1,无法执行A对象的析构,也无法执行控制块的析构
#include <iostream>
#include <memory>
class A {
public:
std::weak_ptr<A> p;
~A() { std::cout << "A's destructor\n"; }
};
int main() {
std::shared_ptr<A> x = std::make_shared<A>();
x->p=x;
return 0;
}
用weak_ptr来解决这个问题,拷贝构造后,控制块的强引用计数还是1,弱引用计数为1
当main结束后,x析构,强引用计数为0,然后A对象析构,执行完函数体后成员p析构,弱引用计数为0,然后控制块析构,不会内存泄漏