《C++学习笔记》动态内存

动态内存和智能指针

内存和智能指针简介

  • 静态内存用于保存局部static对象、类中static数据成员、定义在函数外的变量
  • 栈内存用于保存函数内部的非static对象
  • 堆(*空间)用于存储动态分配的对象,要求显式销毁不用的对象
  • 头文件memory中提供shared_ptr智能指针以允许多个指针指向同一个对象,提供unique_ptr智能指针以独占所指对象,智能指针也是模板
  • 头文件memory中还提供伴随类weak_ptr,指向shared_ptr所管理的对象

程序使用动态内存的3种情况

  • 不知道要使用多少对象
  • 不知道所需对象的准确类型
  • 多个对象之间需要共享数据

使用newdelete

  • 使用new动态分配和初始化对象,并返回指向该对象的指针,初始化可以采用默认初始化(未定义)、值初始化、列表初始化、括号初始化
  • new可以分配const对象,同时也要求对const对象必须初始化
  • 内存耗尽new会抛出bad_alloc异常,可在new后加(nothrow)取消抛异常而改为返回空指针,bad_allocnothrow均在头文件new
  • auto只能推断括号中带有单参数时的类型
  • 使用delete来销毁对象(必须由new创建)并释放内存(只可释放一次)

newdelete并不被推荐的原因

  • 忘记delete,不耗尽内存不容易发现该问题
  • 使用已经释放掉的对象
  • 当两个指针指向同一个对象,容易发生释放两次内存的出错误

两智能指针通用操作

  • shared_ptr<type> spunique_ptr<type> up,分别定义了空智能指针
  • p.get(),返回p中保存的指针
  • swap(p,q)p.swap(q),交换两智能指针

shared_ptr独有的操作

  • make_shared<type>(args),返回shared_ptr智能指针,指向由args初始化(类型对应的构造函数)的对象
  • shared_ptr<type>p(q),拷贝智能指针qp上,同时q中的计数器+1,要求q的指针类型可以转化为p*
    • 任何拷贝都会导致计数器+1,如拷贝初始化、函数传参、函数返回
    • 指针获得新值或者被销毁,计数器就会递减,一旦为0,就会自动释放(调用析构函数)
  • shared_ptr<type>p(q,d),拷贝智能指针qp上,并用d来代替delete
  • shared_ptr<type>p(u)punique_ptr智能指针处接管对象的所有权,并将u置空
  • shared_ptr<type>p(q,d)p接管内置指针q所指的对象,并使用可调用对象来代替delete
  • p = q,该操作导致原来p的计数器递减,q的计数器递增
  • p.use_count(),返回与p共享对象的智能指针数量
  • p.unique(),若p.use_count()为1,则为true,否则为false
  • shared_ptr可以接收new返回的指针作为初始化参数,但因为该版本的构造函数是explicit的,所以必须使用直接初始化形式
  • p.reset()p.reset(q)p.reset(q.d),释放对象、令p指向q、调用d而不是调用delete释放q

动态数组

上一篇:shared_ptr的 reset用法


下一篇:C++ 智能指针