问题1:
A a; //class A
shared_ptr<A> pa = make_shared<A>(a); 为什么会复制一个a对象?
答复:
class A中应该有一个构造函数A(A x),这个构造函数完成了复制。
问题2、
A* a = new A(); //class A
shared_ptr<A> pa(a);
pa.reset();
这个时候a会被释放,为什么?
答复:
智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈上的变量自动被销毁,智能指针内部保存的内存也就被释放掉了(除非将智能指针保存起来)。reset方法放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少。
上面的问题中,首先pa的内部记数为1,当你reset后,就减为0了,所以指向的a也就被释放了。
你可以测试一下我写的这段代码,看看结果加强理解:
- #include <iostream>
- #include <memory>
- using namespace std;
- class A
- {
- public:
- int n;
- };
- int main(int, char*)
- {
- A* a = new A(); //class A
- shared_ptr<A> pa(a); //引用计数加1,此时为引用计数为1
- shared_ptr<A> pa1(pa); //引用计数再加1,此时引用计数为2。若注释掉这句,从(*a).n=1;就会出错了。
- pa.reset(); //释放1次,所以引用计数减1后还剩下1,因此a没被释放掉,可继续下面操作:
- (*a).n=1;
- cout<<(*a).n<<endl;
- cin.get();
- return 0;
- }
复制代码