17入精:CE:cpp std intro

13.5智能指针

13.5.1 raw指针和智能指针

  • new运算符分配一块内存,可将这块内存的地址保存在一个指针变量

  • 指针变量不但可以指向动态分配的内存,也可以指向一个自动变量:

  • 一个T* 类型的指针变量可存储动态分配的内存地址,
    • 也可以存储一个程序块的普通变量的地址。
    • 这种指针称为raw指针(原始指针),因为除了内存地址外它没有存储别的东西。

  • raw指针指向的动态分配内存应该及时释放,并且对new分配的内存要用delete释放
  • new[]分配的内存要用 delete[]释放。
  • 如果一个指针变量在指向新的内存时,没有释放原先指向的动态内存,就会造memory leaks
  • 上述代码中p开始指向的是new分配的动态内存,然后修改p指向了变量i,而原先p指向的内存并没有用 delete释放,
    • 这块动态内存就一直被程序占用,程序的其他部分或其他程序没法访问或释放这块内存,
    • 造成内存泄漏。

  • 如果用错了 delete也会造成内存汇漏

在这里插入图片描述

13.5.2 unique_ptr

  • std::unique_ptr<>对象是对raw指针的包裏
    • 将一个T*类型的动态分配内存块的raw指针
    • 作为构造函数的参数就可以创建一个std:: unique_ptr<T>对象,
    • 它退出其作用域销毁时,
      • 析构函数自动释放其包含的raw指针指向的动态内存

我的天,那这个对象析构的时候他指向的东西也被释放了,我草!!

  • std::unique_ptr<double>类对象p包裹动态分配的内存
  • f()结束时,p被销毁,其析构函数会自动释放动态分配的内存。
  • p和raw指针样,
    • 用解引用运算符*(或间接访问运算符)访问p指向的动态内存

  • 作为一个类对象,
  • p可用unique_ptr<>类的成员函数。
  • 用get()方法得到其包裹的raw指针:

  • reset()将一个新的raw指针传递给它,原来的raw指针指向的内存被自动释放