源代码:
/** \brief 使用std::unique_ptr改写智能指针章节开始的foo()函数** \param* \param* \return**/
#include <iostream>
#include <memory>using namespace std;struct O
{~O(){cout << "我是被管的对象。我要被释放啦......" << endl;};void HaHa(){cout << "HaHa" << endl;}
};struct Killer //是杀手还是管家
{Killer(O * po): po_(po){}~Killer(){cout << "我是管家。我要被释放啦......" << endl;delete po_; //注意这行!}O * po_;
};void foo()
{O* po = new O; //创建一个堆对象叫postd::unique_ptr <O> p(po);p->HaHa();}void foo2()
{
// Killer k(new O());
// //现在只能通过k来使用po对象了
// k.po_->HaHa();std::unique_ptr <O> p(new O);p->HaHa();
}void foo3()
{O* po = new O; //创建一个堆对象叫postd::unique_ptr <O> p(po);p->HaHa();//如果需要临时得到裸指针,但又不希望智能指针撒手不管,//可以使用std::unique_ptr的get方法delete p.get();
}int main()
{cout << "------foo--------" << endl;foo();cout << "------foo2--------" << endl;foo2();cout << "------foo3--------" << endl;foo3();return 0;
}
关键代码:
运行效果:
windows下
linux下
内存释放两次:delete p.get()
可以看到在函数foo_3中,被释放两次,那是因为64行得到智能指针p管理的裸指针,然后将其delete掉了,释放了一次,get()方法并不会使智能指针丧失对裸指针的管理权,所以智能指针会将裸指针再释放一次。这个问题发生在运行期。