静态内存:用来存储static变量与全局变量。

栈内存:用来存储普通局部变量。

内存池(自由空间,堆):用来存储动态分配的对象。这些动态对象的生存期由程序显式控制。

管理动态内存很棘手。

使用动态内存的原因

  1. 程序不知道自己需要使用多少对象(容器)
  2. 程序不知道所需对象的准确类型
  3. 程序需要在多个对象间共享数据

创建与销毁

new,为对象分配空间并返回指向该对象的指针,使用默认初始化或默认构造函数。

格式为new type,type后可接()或{}来调用构造函数或列表初始化。可以在有单一初始化器时使用auto。

当没有只有内存时,new会抛出bad_alloc,可以使用定位new——在new后增加(nothrow)来避免throw,此时会返回空指针,二者都定义于<new>中。

delete,接受一个动态对象的指针,销毁该对象,并释放其对应内存,但内存的地址仍然可能存在在其他指针中,此时要么删除该指针,要么重置nullptr使其不成为空悬指针。

对象必须是动态的或者空指针且未释放过,否则行为未定义。

若是没有释放一个已经不再使用的空间,并且已经没有指针指向它了(内存泄漏),这会导致内存泄漏,也就是这一部分的内存将再也不能被释放,除非程序结束。

必须显式释放。

由于内置类型没有折构函数,所以一个内置类型的指针即便离开了作用域其内存空间并不会有什么变化。

因此需要及时delete,但是很难,最好使用智能指针自动释放。

智能指针

负责自动释放所指向的对象。