内存空间
内存 | 分配 | 管理 | 声明周期 |
---|---|---|---|
静态内存 | static对象,类static成员 | 编译器 | 使用之前 -> 程序结束 |
栈内存 | 函数内非static对象 | 编译器 | 程序块运行时 |
堆(自由空间) | 动态分配 | 手动 | 创建 -> 显式销毁 |
动态内存
忘记释放 -> 内存泄露
提前释放 -> 非法指针
使用动态内存的一个常见原因是允许多个对象共享相同的状态。
shared_ptr
计数器变为0时,释放内存。
shared_ptr<T>p(q); //p是q的拷贝;增加q中的计数器
p = q; //递减p中计数器,递增q中计数器
离开作用域时,递减计数器。
void bar1(T arg)
{
shared_ptr<Foo> p = factory(arg);
//使用p
} //p离开作用域,递减计数器,变为0,释放内存
返回时,计数器+1
void bar2(T arg)
{
shared_ptr<Foo> p = factory(arg);
//使用p
return p; //计数器+1
} //离开作用域,但内存并不会被释放