此部分为基于《C++ Primer(中文版)》(第五版)的总结。

在C++中,除过静态内存和栈内存之外,每个程序还有一个内存池,这部分的内存被称为自由空间或者内存堆。程序可以在堆上存储那些动态分配的对象。当对象不再使用时,我们必须显式的销毁掉这些被分配的对象。否则这些动态分配的内存将在程序结束的时候由操作系统统一来回收。
C++的内存管理依赖 newdelete 这一对运算符来实现。new负责开辟堆上内存,delete则负责销毁。
保证在正确的时间释放内存是极其困难的,动态内存管理中常常会出现两种问题:一种是忘记释放内存,导致内存泄漏,程序会在运行时消耗大量的内存。一种是在尚有指针引用内存的情况下就被释放,就会产生引用非法内存的指针。
为了更加安全的使用动态内存,新的标准库中提供了两种智能指针来管理动态对象: shared_ptrunique_ptr ;这两种指针的区别在于管理内存指针的方式,shared_ptr允许多个指针指向同一对象;unique_ptr独占所指向的对象。标准库还定义了一个名为wead_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象。这三种类型都定义在mempory

  • 智能指针有四种: auto_ptrshared_ptrweak_ptrunique_ptr 其中auto_ptr已在c++11中被弃用。C++提供两种指针shared_ptr和unique_ptr(定义在中)
  • 举例一种业务场景,指针p指向的内容在类A和B中都要用到,此时p被传值给A,但当A被析构之后,p指向的地址此时其实已经被释放了。那B就用不了了。而我们的期待是在指向对象的最后一个指针被销毁时,该对象才会被销毁

    shared_ptr类

    类似vector,智能指针也是模板。因此,当创建一个只能指针的时,必须提供额外的信息——指针可以指向的类型。与vector一样,我们在尖括号内出类型,之后是锁定为的这种只能指针的名字: ```cpp shared_ptr p1; //shared_ptr,可以指向string shared_ptr> p2; //shared_ptr,可以指向int的list

``` 默认初始化的智能指针中保存这一个空指针。
shared_ptr可以被用来实现共享指向对象的功能,多个智能指针可以引用同一个对象,当最后一个指针被销毁的时候,对象才会被销毁。
我们可以认为shared_ptr都已一个关联的计数器,通常称其为引用计数,无论何时拷贝一个shared_ptr,计数器都会递增。当给shared_ptr赋予一个新值或者一个shared_ptr被销毁,一旦一个shared_ptr的计数器变为0,它就会自动释放自己所管理的对象。
image.png
image.png

make_shared函数

最安全的分配和使用动态内存的方法是调用一个名为make_shared的标准库函数。此函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。
image.png

unique_ptr

unique_ptr可以被用来实现所有权互斥的功能