智能指针介绍
C++11 提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,定义在头文件 <memory>
中。其中auto_ptr 是 C++98 提供的解决方案,C+11 已将其摒弃,并提出了 unique_ptr 作为 auto_ptr 替代方案。虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用较新的 unique_ptr,因为 unique_ptr 比 auto_ptr 更加安全。shared_ptr 和 weak_ptr 则是 C+11 从准标准库 Boost 中引入的两种智能指针。
1. auto_ptr 指针
auto_ptr 是C++标准库提供的类模板,auto_ptr 对象通过初始化指向由new创建的动态内存,采用所有权模式。它是这块内存的拥有者,一块内存不能同时被分给两个拥有者。当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有的动态内存自动释放。即使发生异常,通过异常的栈展开过程也能将动态内存释放。auto_ptr不支持new 数组。
初始化auto_ptr对象的方法如下:
#include <iostream>
#include <string>
#include <memory>
using namespace std;
int main()
{
// 直接构造智能指针
auto_ptr<string> p1(new string("Hello Ming."));
// 将已存在的指向动态内存的普通指针作为参数来构造
int* p = new int(33);
auto_ptr<int> p2(p);
std::cout << *p1 << std::endl;
std::cout << *p2 << std::endl;
// 利用已经存在的智能指针来构造新的智能指针(拷贝构造)
auto_ptr<string> p3(p1); // 此时,p1失去内存所有权,p3获得所有权以及负责内存的自动销毁
//std::cout << *p1 << std::endl; // 内存崩溃
std::cout << *p3 << std::endl;
// 利用已经存在的智能指针来构造新的智能指针(赋值)
auto_ptr<int> p4;
p4 = p2; // p4剥夺了p2的所有权, 且 auto_ptr 不会报错
//std::cout << *p2 << std::endl; // 内存崩溃
std::cout << *p4 << std::endl;
}
由上面的例子可以看出,当auto_ptr的内存所有权被剥夺时,编译器不会报错,导致使用 auto_ptr 指针时存在潜在的内存崩溃的缺点。因此C++11 将其摒弃,并提出了 unique_ptr 作为