在现代 C++ 编程中,标准库包含智能指针,该指针用于确保程序不存在内存和资源泄漏,而且是异常安全的。
原始指针:RawPointer
智能指针:SmartPointer
原始指针和智能指针比较:
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! delete pSong; } void UseSmartPointer() { // Declare a smart pointer on stack and pass it the raw pointer. unique_ptr<Song> song2(new Song(L"Nothing on You", L"Bruno Mars")); // Use song2... wstring s = song2->duration_; //... } // song2 is deleted automatically here.
在初始化智能指针后,它将拥有原始的指针。这意味着智能指针负责删除原始指针指定的内存。智能指针析构函数包括要删除的调用,并且由于在堆栈上声明了智能指针,当智能指针超出范围时将调用其析构函数,尽管堆栈上的某处将进一步引发异常。
通过使用熟悉的指针运算符(-> 和 *)访问封装指针,智能指针类将重载这些运算符以返回封装的原始指针。
C++ 智能指针思路类似于在语言(如 C#)中创建对象的过程:创建对象后让系统负责在正确的时间将其删除。不同之处在于,单独的垃圾回收器不在后台运行;按照标准 C++ 范围规则对内存进行管理,以使运行时环境更快速更有效。
引用计数为0时,内存对象释放是GCC的惯用算法,但c++没有GCC,用户自己控制内存,智能指针让用户可以手动实现一个简单的GCC,确保不发生内存泄漏。
C++ 标准库智能指针:
unique_ptr
shared_ptr
weak_ptr
msdn文档地址:https://msdn.microsoft.com/zh-cn/library/hh279674.aspx (这个写的很好很详细)
原文:http://www.cnblogs.com/yiii/p/5325990.html