静态内存用来保存局部静态对象,类静态数据成员以及定义在任何函数之外的变量.
栈内存用来保存定义在函数内的非static对象.
分配在静态或栈内存的对象由编译器自动创建和销毁.
栈对象在其定义的程序块运行时才存在;静态对象在使用之前分配,在程序结束时销毁.
堆用来存储动态分配的对象, 即在程序运行时分配的对象.动态对象的生命期由程序控制.也就是说,当动态对象不再使用时,必须在代码中显式地销毁它们.
c++动态内存的管理由一对运算符new和delete来完成.
new在动态内存中为对象分配空间并返回一个指向该对象的指针.
delete:接受一个动态对象的指针,销毁该对象,并释放该对象占用的内存.
常规指针的缺陷
如果忘记了释放内存,就会导致内存泄露.
如果在还有指针引用内存的情况就释放了内存会产生引用非法内存的指针.
智能指针与常规指针的区别在于, 智能指针是类类型, 在离开作用域时会自动调用析构函数, 自动释放内存.
程序使用动态内存的原因
原因 | 例子 |
---|---|
程序不知道自己需要使用多少对象 | 容器类 |
程序不知道所需对象的准确类型 | 动态绑定 |
程序需要在多个对象间共享数据 | strBlob类 |
shared_ptr: 多个指针可以指向同一个对象.使用引用计数来记录该对象的资源被多少个指针共享.当引用计数为0时, 资源自动释放.
unique_ptr:同一时刻只能有一个unique_ptr指向一个给定对象.unique_ptr独占对象的资源.unique_ptr不支持普通的拷贝和赋值.可以通过release和reset将指针的所有权从一个unique_ptr转移到另一个unique_ptr.
weak_ptr:不控制所指向对象生存期的智能指针,它指向由一个shared_ptr管理的对象.将一个weak_ptr绑定到一个shared_ptr不会改变该shared_ptr的引用计数.因此, weak_ptr指向的对象可能被释放掉.