shared_ptr是通过引用计数维护内存的所有权,因此可以多个智能指针共享同一块内存:
#include <memory>
using namespace std;
class A{
public:
A(int d):m_data(d)
{
cout<<"Construct A to:"<<m_data<<" this addr:"<<this<<endl;
}
~A()
{
cout<<"Destruct A, this addr:"<<this<<endl;
}
int m_data;
};
ostream& operator<<(ostream& os, const A &a)
{
os<<a.m_data<<" addr:"<<&a;
return os;
}
int main(){
shared_ptr<A> up1(new A(1)); //调用构造函数,构造匿名对象,记作a,输出:Construct A to:1 this addr:0x6d6f90
cout<<"pos1 m_data:"<<*up1<<endl; //访问up1指向的对象a,输出:pos1 m_data:1 addr:0x6d6f90
shared_ptr<A> up2 = up1; //up2与up1共享同对内存对象a的访问
cout<<"pos2 m_data:"<<*up2<<endl; //输出:pos2 m_data:1 addr:0x6d6f90
up1.reset(); //up1释放对a的访问权,降低引用计数,由于此时up2还拥有对内存对象a的访问权,因此不会释放对象a
cout<<"pos3 m_data:"<<*up2<<endl; //输出:pos3 m_data:1 addr:0x6d6f90
up2.reset(); //up2释放对a的访问权,降低引用计数,由于此时引用计数为0,释放内存,调用析构函数,输出:Destruct A, this addr:0x6d6f90
return 0;
}