delete p
语句——实际上根本不需要编写这条语句,托管 p 的 shared_ptr 对象在消亡时会自动执行delete p
。而且,该 shared_ptr 对象能像指针 p —样使用,即假设托管 p 的 shared_ptr 对象叫作 ptr,那么 *ptr 就是 p 指向的对象。shared_ptr<T> ptr(new T); // T 可以是 int、char、类等各种类型
此后,ptr 就可以像 T* 类型的指针一样使用,即 *ptr 就是用 new 动态分配的那个对象。delete p
。#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 << 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) sp2.reset(new A(4)); // sp2托管A(4) cout << sp1->i << endl; //输出 3 sp3.reset(new A(5)); // sp3托管A(5),A(2)无人托管,被delete cout << "end" << endl; return 0; }程序的输出结果如下:
A* p = new A(10); shared_ptr <A> sp1(p), sp2(p);sp1 和 sp2 并不会共享同一个对 p 的托管计数,而是各自将对 p 的托管计数都记为 1(sp2 无法知道 p 已经被 sp1 托管过)。这样,当 sp1 消亡时要析构 p,sp2 消亡时要再次析构 p,这会导致程序崩溃。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有