静态内存:保存局部static对象,类static数据成员,定义在任何函数外的变量。
栈内存:保存定义在函数内的非static对象。
分配在静态内存与栈内存中的对象由编译器自动创建与销毁。对于栈对象,仅在其定义的程序块运行时才存在;static对象在使用前分配,程序结束时销毁。
除此之外,每个程序还有有一个内存池。这部分内存被称作自由空间(free store)或堆(heap)。程序用堆来存储动态分配的对象,当该对象不再使用时,我们的代码必须显示的销毁它们。
动态内存与智能指针
- shared_ptr
shared_ptr<string> p1;
shared_ptr<list<int>> p2;
//条件判断中使用智能指针,判空
//之后调用的是string的empty检查p1是否指向空字符串
if(p1 && p1->empty())
*p1=:"hi";
智能指针支持的操作
- shared_ptr sp //指向类型为T的对象
- unique_ptr up
- p //条件判断,若指向对象,则返回true
- *p //解引用获得对象
- p->mem //等价于(*p).mem
- p.get() //返回p中保存的指针
- swap(p,q) //交换指针
- p.swap(q)
shared_ptr支持的特殊操作
- p.unique() //若p.use_count()==1 返回true
- p.use_count() //返回与p共享对象的智能指针数目
- make_shared (args) //返回一个shared_prt 指向一个动态分配的类型为T的对象,使用args初始化该对象
make_shared函数
shared_ptr<int> p1 = make_shared<int> (42);
shared_ptr<int> p2 = make_shared<string> (10,'9'); //"999999999"
shared_ptr 计数器为0时,调用析构函数,销毁对象,释放内存。
shared_ptr<Foo> factory(T arg){
//处理arg
return make_shared<Foo>(arg);
}
void use_factory(T arg){
shared_ptr<Foo> p=factory(arg);
//使用p
}//p离开作用域,计数器递减,指向的内存被释放
shared_ptr<Foo> use_factory(T arg){
shared_ptr<Foo> p = factory(arg);
return p; //返回p,计数器递增
}//p离开作用域,指向的内存不会被释放