本文适用于新手阶段的人员阅读,是本人初步学习C++智能指针之后的总结,仅对C++中的智能指针做简单的介绍。
在C语言中规定使用指针对内存资源进行操作,资源的申请与释放必须由开发者主动执行。但在大型项目中,内存资源经常会由多个模块共享,经过复杂的程序逻辑,开发者经常会忘记释放内存资源或使用指针访问错误的内存地址,进而导致内存问题。这些问题是由C语言的指针语法决定的,无法规避,因此在C++中,提出了智能指针的概念,它对C语言中的指针做了封装,创建了“所有权”的概念,将内存资源的回收交给程序执行,从而规避常见的内存错误(没有一种语言能完全规避内存错误,即使是java)。
C++的智能指针将指针封装为对象,进而使用程序管理这个对象的声明周期。在C++11之后,智能指针有3中:std::unique_ptr,std::share_ptr,std::weak_ptr,下面对它们一一进行介绍。
一、std::unique_ptr
std::unique_ptr独享指针的所有权,当std::unique_ptr对象声明周期结束,调用析构函数时,会自动释放其封装的指针所指向的资源。
std::unique_ptr无法赋值到其它std::unique_ptr,无法直接通过值传递到函数参数,也无法用于任何需要拷贝的标准模板库算法。std::unique_ptr只能通过std::move转移所有权,这意味着在转移所有权之后,原始std::unique_ptr就不再拥有该内存资源。需要注意的是C++允许从函数中返回一个std::unique_ptr,返回后函数内的std::unique_ptr失去所有权,移动给返回值。
1.1 创建std::unique_ptr
|
需要注意的是,这里有一个可能犯的编程错误,即使用相同的指针创建std::unique_ptr,代码如下:
int *ptr = new int(5); std::unique_ptr<int> uPtr(ptr); std::unique_ptr<int> uPtr1(ptr);< |