先说一句为什么要用智能指针。智能指针是为了解决内存泄露的问题。C/C++程序员可以自己开辟堆(heap)上的内存空间,同时也需要自己释放堆上的内存空间。一旦忘记释放内存空间,这样会造成内存泄露。
不得不提及一下RAII机制(资源获取即初始化,Resource Acquisition Is Initialization)。在类的构造函数里面申请资源,然后使用,最后在析构函数中释放资源。所以这也就为什么析构函数需要用virtual来修饰来避免出现内存泄露。
计算机有栈和堆两种。
这里提及一点。C++中的对象(class)是指所有的内置型对象(int、float、double等和外置型(用户自定义的对象)对象。一切皆为对象。
如果在栈上创建相应的class,那么OS会自动释放掉相应的内存空间,所以RAII机制工作正常,离开相应的作用域时,class会自动调用自己的析构函数释放资源。但是如果采用new方式在堆上创建class,那么class不会调用自己的析构函数。程序员必须使用delete去销毁它。否则就会造成内存泄露。
这里再插入两个小知识,我以前面试腾讯外包时被问到的点。
-
new、delete的机制。
-
new会抛出异常以及如何让new不抛异常。
1.new有两个步骤:(1)调用operator new()函数开辟内存空间。(2)调用class的构造函数。
delete也有两个步骤:(1)调用class的析构函数。(2)调用operator delete()释放内存。
2.new会抛出异常。为了防止抛出异常。就应该使用 std::nothrow。例:
char *ptr = new(std::nothrow) char [20];
开始介绍智能指针,他们都包含在头文件#include <memory>中。主要解决了部分获取资源自动释放的问题。
-
unique_ptr
独占式智能指针,不允许拷贝复制,不允许拷贝构造。它不仅能代理new创建的单个对象,也能够代理new[]创建的对象数组。
代码如下:
///
///