引言
智能指针和普通指针的区别在于智能指针实际上是对普通指针加上了一层封装机制,这样的一层封装机制的目的是为了使智能指针可以方便的管理一个对象的生命期。
在C++中,我们知道,入伏哦使用普通的指针来创建一个指向某个对象的指针,那么在使用完这个对象之后我们需要自己删除它,例如:
ObjectType* temp_ptr =new ObjectType(); temp_ptr->foo(); delete temp_ptr;
很多材料上都会
指出如果程序员忘记在调用完temp_ptr之后删除temp_ptr,那么会造成哟个指针悬挂(dangling pointer),也就是说这个指针现在指向的内存区域程序员无法把控和控制,也可能会造成内存泄漏。
可是事实上,不只是“忘记”,在上述的一段程序中,如果foo()在运行时抛出异常,那么temp_ptr所指向的对象仍不会被安全删除。
在这个时候,智能指针的出现实际上就是为了可以方便的控制对象的生命期,在智能指针中,一个对象什么时候和在什么条件下要被析构或者是删除是受智能指针本身所决定的,用户并不需要管理。
智能指针的使用
智能指针是在头文件中的std空间中定义的,它们对RAII或“获取资源即初始化”编程惯用法至关重要。此习惯用法的主要目的是确保资源获取与对象初始化同时发生,从而能够创建该对象的所有资源并在某行代码中准备就绪。实际上,RAII的主要原则是为将任何堆分配资源(例如,动态分配内存或系统对象句柄)的所有权提供给其析构函数,这包含用于删除或释放资源的代码以及任何相关请理代码的堆栈分配对象。
大多数情况下,当初始化原始指针或资源句柄以指向实际资源时,会立即将指针传递给智能指针。在现代C++中,原始指针仅用于范围有限的小代码块、循环或者性能至关重要且不会混淆所有权的Helper函数中。
下面的示例将原始指针声明和智能指针声明进行了比较:
void UseRawPointer() {// Using a raw pointer -- not recommended. Song* pSong =new Song(L"Nothing on You", L"Bruno Mars");// Use pSong...// Don't forget to delete!