智能指针是存储动态分配对象指针的类,用于生命周期的控制。当指针离开其作用域时,自动销毁动态分配的空间,防止内存泄漏。在C++编程中,应该尽量使用智能指针,在很大程度上可以避免内存泄漏。
C++11中共有三个智能指针:shared_ptr, weak_ptr, unique_ptr,由于weak_ptr不常用,没有进行整理。
使用智能指针需要包含头文件 #include<memory>
- shared_ptr
std::shared_ptr采用引用计数,每一个shared_ptr的拷贝都指向相同的内容,当最后一个shared_ptr析构的时候,内存被释放。
使用方法,如下:
std::shared_ptr<string> test; // 定义一个string型的智能指针
test = std::make_shared<string>("hello"); // 利用make_share函数,给指针赋值
std::share_ptr<T> test2; // 定义一个T类的指针
auto test2 = std::make_shared<T>() // 利用make_share对类指针进行实例化
- unique_ptr
std::unique_ptr用法与shared_ptr类似。
区别:
1. unique_ptr指向的位置,不能被其他指针访问,即该指针不能拷贝。
2. 在C++11中,没有make_share()类似的函数,对std::unique_ptr进行初始化。
使用方法,如下:
std::unique_ptr<string> test; // 定义一个string型的智能指针
test = unique_ptr<string>(new string("world")); // 对string类型的指针开辟空间。
std::share_ptr<T> test2; // 定义一个T类的指针
auto test2 = std::unique_ptr<T>(new T()) // 调用类的构造函数,开辟空间
- 示例程序
#include <iostream>
#include <memory>
using namespace std;
class A
{
public:
A() { cout << "hello" << endl; }
void B() { cout << "world" << endl; }
};
int main()
{
// 智能指针
std::shared_ptr<A> test;
test = std::make_shared<A>(); // 在堆上开辟空间
test->B(); // 调用类中的方法
std::unique_ptr<A> test2;
test2 = unique_ptr<A>(new A());
test2->B();
}