静态内存用来保存局部 static 对象、类 static 数据成员 以及任何定义在函数之外的变量。栈内存用来存储定义在函数内部的非 static 对象。分配在静态或栈内存中的对象由编译器自动创建和销毁。对于栈对象,仅在其定义的程序块运行时才存在;static 对象在使用之前分配,在程序结束时销毁。
除了静态内存和栈内存,每个程序还拥有一个内存池。这部分内存被称作自由空间或堆。程序用堆来存储动态分配的对象——即,那些在程序运行时分配的对象。动态对象的生存周期由程序来控制,即当动态对象不再使用时,我们的代码必须显示的销毁它们。
动态内存与智能指针:
c++中东台内存时通过一对运算符来完成的:new,在动态内存中为对象分配内存空间并返回一个指向该对象的指针,我们可以选择对象进行初始化;delete,接受一个动态对象的指针,销毁该对象并释放与之关联的内存。
c++11标准库中提供了两种智能指针类型来管理动态内存对象。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。标准库提供的这两种智能指针的区别在于管理底层指针的方式:shared_ptr 允许多个指针指向同一个对象;unique_ptr 则 “独占” 所指向的对象。标准库还定义了一个名为 weak_ptr 的伴随类,它是一个弱引用,指向 shared_ptr 所管理的对象。这三种类型都定义在 memory 头文件中
shared_ptr 类:
智能指针也是模板:
1 #include <iostream> 2 #include <memory> 3 #include <list> 4 using namespace std; 5 6 int main(void){ 7 shared_ptr<string> p1;//shared_ptr,可以指向string 8 shared_ptr<list<int>> p2;//shared_ptr,可以指向int的list 9 10 if(p1 && p1->empty()) *p1 = "hi";//如果p1指向一个空string,解引用p1,将一个新值赋予string 11 12 return 0; 13 }