通用工具¶
Smart Pointer¶
Class shared_ptr¶
托管 Pointer 的 最后一个shared_ptr 象在reference被删除是时,会自动执行delete释放指针。
#include <iostream>
#include <memory>
using namespace std;
class A
{
public:
int i;
A(int n):i(n) { };
~A() { cout << i << " " << "destructed" << endl; }
};
int main()
{
shared_ptr<A> sp1(new A(2)); /* A(2)由sp1托管, */
shared_ptr<A> sp2(sp1); /* A(2)同时交由sp2托管 */
shared_ptr<A> sp3;
sp3 = sp2; /* A(2)同时交由sp3托管 */
cout << "use_count : " << sp3.use_count() << endl;
cout << sp1->i << "," << sp2->i <<"," << sp3->i << endl;
A * p = sp3.get(); /* get返回托管的指针,p 指向 A(2) */
cout << p->i << endl; /* 输出 2 */
sp1.reset(new A(3)); /* reset导致托管新的指针, 此时sp1托管A(3) */
cout << "sp1.reset(A(3)), sp3.use_count : " << sp3.use_count() << endl;
sp2.reset(new A(4)); /* sp2托管A(4) */
cout << sp1->i << endl; /* 输出 3 */
cout << "sp2.reset(A(4)), sp3.use_count : " << sp3.use_count() << endl;
sp3.reset(new A(5)); /* sp3托管A(5),A(2)无人托管,被delete*/
cout << "sp3.reset(A(5)), sp3.use_count : " << sp3.use_count() << endl;
sp3.reset(); /* 复位,A(5)无人托管,被delete*/
cout << "sp3.reset(); sp3.use_count : " << sp3.use_count() << endl;
cout << "end" << endl;
return 0;
}
use_count : 3
2,2,2
2
sp1.reset(A(3)), sp3.use_count : 2
3
sp2.reset(A(4)), sp3.use_count : 1
2 destructed
sp3.reset(A(5)), sp3.use_count : 1
5 destructed
sp3.reset(); sp3.use_count : 0
end
4 destructed
3 destructed