1.1 基本语义
c++11 引入unique_ptr智能指针,其对所管理资源拥有独占语义,不能多个多个unique_ptr管理同一个资源,离开其作用域时,会使用与其关联的删除器释放所管理的资源,c++14新增 make_unique工程方法来构造unique_ptr指针,从而避免在程序中显示使用new分配内存。
unique_ptr提供了两个构造函数,用来管理数组或者对象资源,其Deleter模板参数可以指定删除器,用来释放所管理的资源
template<
class T,
class Deleter = std::default_delete<T>
> class unique_ptr;
template <
class T,
class Deleter
> class unique_ptr<T[], Deleter>;
使用unique_ptr管理文件
#include <iostream>
#include <memory>
using namespace std;
int main(int argc, char** argv)
{
//构造文件删除器
auto CloseFile = [](FILE* pFile) {
cout << "close file" << endl;
::fclose(pFile);
};
//指定删除器
unique_ptr<FILE, decltype(CloseFile)> pFile(::fopen("./main.cpp", "a+"), CloseFile);
if (!pFile){
cout << "open file error"<<endl;
}
return 0;
}
1.2 unique_ptr对资源所有权的管理
unique_ptr对所管理的资源拥有独占权,意味着不能将其赋值给其他对象,因此其copy constructor和assignment constructor都被禁掉了,也意味着不能通过函数值传递unique_ptr对象,也不能通过返回值返回unique_ptr的值。但是unique_ptr支持移动语意,我们可以通过移动语义,交出unique_ptr对资源的占有权,其move constroctor和move assignment operator是放开。
unique_ptr<FILE, decltype(CloseFile)> filePtr = pFile; //compile filed
unique_ptr<FILE, decltype(CloseFile)> filePtr = std::move(pFile); //compile success
unique_ptr<FILE, decltype(CloseFile)> filePtr(std::move(pFIle)) //comple success