C++ 如何管理资源?
1.堆
- 采用new/delete来进行内存的分配和释放,底层调用malloc/free
- 内存碎片问题,由于分配内存需要完整的内存块,而释放内存时会导致内存是不连续的
- 内存泄漏问题。当new分配内存,而没有使用delete释放内存的时候,会出现内存泄漏。有时这两个操作并不是在一个地方,因此有很大隐患,可以采用RAII的机制进行内存的分配和释放
2.栈
- 栈是一种“后进先出”的结构,每次函数调用都会出发一次压栈,因此采用栈的方式管理内存不会出现内存碎片的问题
- 内存的分配和释放本质是栈指针的移动
- 函数发生异常的情况下,编译器会自动调用析构函数,这个叫栈展开
3.RAII
- C++ 支持将对象存储在栈上面。但是,在很多情况下,对象不能,或不应该,存储在栈上。比如:对象很大;对象的大小在编译时不能确定;对象是函数的返回值,但由于特殊的原因,不应使用对象的值返回。
- 将分配内存所得值放到一个本地变量里,并确保其析构函数会删除该对象即可(本质是用变量去管理内存)
- 例子:加锁和释放锁,std::lock_guard guard(mtx)