C++11:18shared_ptr共享的智能指针

18shared_ptr共享的智能指针

0、课前秀

  • 智能指针不会担心内存泄漏的问题,会自动删除分配的内存。
  • 智能指针是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保在离开指针所在作用域时,自动正确地销毁动态分配的对象,防止内存泄漏。
  • 提供3种智能指针,引用头文件<memory>
    • std::shared_ptr
    • std::uniq_ptr
    • std::weak_ptr
  • shared_ptr是个类,要用类的思维去学它,不是个关键字。

1、shared_ptr原理介绍

  • std::shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。
  • 在最后一个shared_ptr析构的时候,内存才会被释放。

2、shared_ptr的基本用法

2.1、初始化

  • 代码
std::shared_ptr<int> p(new int(1));
std::shared_ptr<int> p2 = p;
//reset方法来初始化
std::shared_ptr<int> ptr;
ptr.reset(new int(1));
if(ptr)
{
    cout<<"ptr is not null";
}

2.2、获取原始指针

std::shared_ptr<int> ptr(new int(1));
int* p = ptr.get();

2.4、指定删除器

  • 一般写法
void DeleteIntPtr(int* p)
{
    delete p;
}
std::shared_ptr<int> p(newint,DeleteIntPtr);
  • lambda表达式写法

std::shared_ptr<int> p(new int,[](int* p){delete p;});

3、使用shared_ptr需要注意的问题

  • 不要用一个原始指针初始化多个shared_ptr
  • 不要在函数实参中创建shared_ptr。
  • 通过shared_from_this()返回this指针。
  • 要避免循环引用

ReadMe

  • 20200506整理完第一版,《深入应用C++》4.1。
    • 事实上有点稀里糊涂的,没有主动把知识串起来的感觉
原文地址:https://www.cnblogs.com/fewolflion/p/12937221.html