智能指针类型
在C++程序中,普通变量使用栈内存,为函数运行时专用,结束后会自动释放,无须考虑内存释放问题。 但堆内存是共用的,其使用是通过指针变量的new来分配,使用delete来释放,因指针使用方便,很容易让程序员上瘾,其代价是各种原因造成的内存泄露问题,如:
- 忘记使用delete释放指针变量
- 指针数组,没有释放成员指针的内存
- 指针指向一个新地址,原地址内容未释放
- 异常处理程序,跳过了 delete 语句,致使指针未释放
等等,对服务器应用程序来说,内存泄露常常是致命的。
C++11后,STL增加了智能指针类型,主要有
- std::shared_ptr,
- std::weak_ptr
- std::unique_ptr
智能指针是指针上的包装类,重载了*
和>
等运算符。智能指针类的对象看起来像普通指针。但是,与普通指针不同,在析构函数里释放了指针,因此无须担心忘记释放指针。
unique_ptr用法
unique_ptr是智能指针最简单形式。 unique_ptr指向1个内存对象,而且是指向这个对象的唯一指针,这样可以避免出错。 但尽量不要将unique_ptr做为参数传给第3方接口函数,以避免对方以复制指针的方式来使用它。
使用语法
#include <memory>
using namespace std;
unique_ptr<A> ptr(new A(初始化参数));
// 或者使用make_unique<T>() 模板函数来初始化unique_ptr
unique_ptr<A> ptr = make_unique<A>(初始化参数);
如定义1个int 类型的unique_ptr
int a = 99;
unique_ptr<int> ptr = make_unique<int>(a);
// std::unique_ptr x(new int(99));
// *ptr为指向对象的值,ptr.get()为对象地址
cout << *ptr << ", " << ptr.get() << endl;
手工释放
ptr.reset();
ptr.reset(new int(1)); // 释放后,重新指向新地址
指向数组
unique_ptr<int[]> x(new int[5]);