在C++里,我们用new delete 两个操作符管理动态内存,new出的对象内存在堆上。
一旦我们忘记释放动态内存会导致内存泄漏,智能指针可以很好的避免这个问题。
shared_ptr :允许多个指针指向同一个对象
shared_ptr<int> p1; // 定义一个指向int的智能指针
shared_ptr<list<int>> p1; // 定义一个指向lits<int>的智能指针
shared_ptr<int> p2(new int(42)); // 定义一个指向值为42的int类型的智能指针
auto p1 = make_shared<int>(9); // 指向int的指针有一个
auto p2(p1); // p1 p2指向同一个对象,指向int的指针有两个
// if p1 is not null, check whether it's the empty
if (p1 && p1->empty())
{
*p1 = 77777777; // 致敬颗粒尔辣舞
}
当最后一个shared_ptr指向object的指针被销毁,shared_ptr类会自动销毁它指向的对象并且释放内存。
智能指针的计数:
当我们复制或分配shared_ptr, 每个shared_ptr 会追踪多少个其他shared_ptr指向同一个对象。
p.get() 指向*p的个数
swap(p1,p2); p1.swap(p2); 交换两个指针指向的对象
auto p1 = shared_ptr<int>(9); // p1 count 1
auto p2 = shared_ptr<int>(7); // p2 count 1
p2 = p1; // p1 count 2, p2 count 0, object freed automatically
make_shared : 在动态内存分配并初始化一个对象,并返回指向对象的指针shared_ptr
shared_ptr<int> p1 = make_shared<int>(42); // 创建int指针,值为42
shared_ptr<string> p2 = make_shared<string>(10, '9'); // 创建string指针,值为9999999999
shared_ptr<int> p3 = make_shared<int>(); // 创建int指针,值为0(默认初始化)
auto p4 = make_shared<vector<string>>(); // p4指向vector<string>,值为空
unique_ptr :单独拥有它指向的对象
unique_ptr独占它指向的对象,不支持拷贝、赋值操作。
unique_ptr<double> p1;
unique_ptr<int> p2(new int(42));
unique_ptr<int> p3(p2); // error: no copy
auto p4 = p2; // error: no assign
参考文献:
C++ Primer 第五版 P450 Dynamic Memory and Smart Pointers