源代码:
/** \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; //创建一个堆对象叫po
std::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; //创建一个堆对象叫po
std::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()方法并不会使智能指针丧失对裸指针的管理权,所以智能指针会将裸指针再释放一次。这个问题发生在运行期。