一、智能指针介绍
智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针是一个类,当超出了类的实例对象的作用域时,会自动调用对象的析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。
二、详解
1.auto_ptr
ps:C++98的方案,现在通用的是C++11,最新的是C++20,这个auto_ptr指针现在已经被unique_ptr代替,所以可以忽略掉。
2.unique_ptr
unique是独有特有的意思,所以这个unique_ptr指的是独占式指针,保证同一时间内只有一个指针指向一个对象,并且不能拷贝或者复制给其他对象,其拥有的内存仅自己独占
<1>std::unique_ptr的实现如下:
template <class T>
class unique_ptr
{
//省略其他代码...
//拷贝构造函数和赋值运算符被标记为delete
unique_ptr(const unique_ptr &) = delete;
unique_ptr &operator=(const unique_ptr &) = delete;
};
<2>初始化一个std::unique_ptr对象方法:
int main()
{
//方式1
std::unique_ptr<int> object1(new int(123));
//方式2
std::unique_ptr<int> object2;
object2.reset(new int(123));
//方式3
std::unique_ptr<int> object3 = std::make_unique<int>(123);
}
通常用方式3的std::make_unique去创建并初始化一个unique_ptr的对象
<3>std::make_unique的实现如下:
template <typename T, typename... Ts>
std::unique_ptr<T> make_unique(Ts &&...params)
{
return std::unique_ptr<T>(new T(std::forward<Ts>(params)...));
}
<4>std::unique_ptr不仅可以持有一个对象,还可以持有一组对象,实现如下:
#include <memory>
#include <iostream>
int main()
{
//创建10个int类型对象
//方式1
std::unique_ptr<int[]> object1(new int[10]);
//方式2
std::unique_ptr<int[]> object2;
object2.reset(new int[10]);
//方式3
std::unique_ptr<int[]> object3(std::make_unique<int[]>(10));
for (int i = 0; i < 10; ++i)
{
object1[i] = i;
object2[i] = i;
object3[i] = i;
}
std::cout << "begin~" << std::endl;
for (int i = 0; i < 10; ++i)
{
std::cout << object1[i] << " " << object2[i] << " " << object3[i] << std::endl;
}
std::cout << "end~" << std::endl;
return 0;
}
打印如下: