C++的内存管理还是要自己来做的,自己要进行内存的申请和释放
程序直接kill掉,OS会回收的
但是面试要问到这个问题,其实是想问你别的
RAII,也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源、避免内存泄露的方法。它保证在任何情况下,使用对象时先构造对象,最后析构对象。
资源管理
智能指针(std::shared_ptr和std::unique_ptr)即RAII最具代表的实现,使用智能指针,可以实现自动的内存管理,再也不需要担心忘记delete造成的内存泄漏。毫不夸张的来讲,有了智能指针,代码中几乎不需要再出现delete了。这个特性其实是lambda延伸出来的
内存只是资源的一种,在这里我们讨论一下更加广义的资源管理。比如说文件的打开与关闭、windows中句柄的获取与释放等等。按照常规的RAII技术需要写一堆管理它们的类,有的时候显得比较麻烦。但是如果手动释放,通常还要考虑各种异常处理。
可以使用C++11标准中的lambda表达式和std::function相结合的方法,http://mindhacks.cn/2012/08/27/modern-cpp-practices/
状态管理
RAII另一个引申的应用是可以实现安全的状态管理。一个典型的应用就是在线程同步中,使用std::unique_lock或者std::lock_guard对互斥量std:: mutex进行状态管理。
小总结
RAII的核心思想是将资源或者状态与对象的生命周期绑定,通过C++的语言机制,实现资源和状态的安全管理。
存在问题
虽然C++11中的智能指针,一定程度上简化了C++当中的内存管理;但是,shared_ptr<>的使用同时也引出了另一个问题:循环引用。
解决方法:
1 . 当只剩下最后一个引用的时候需要手动打破循环引用释放对象。
2 . 当A的生存期超过B的生存期的时候,B改为使用一个普通指针指向A。
3 . 使用弱引用的智能指针打破这种循环引用。
boost::weak_ptr,即弱引用来代替循环引用中的某个强引用,从而打破循环引用的环。
auto_ptr被放弃,因为不安全,delete可能会出问题(auto是占位符的意思,和这个智能指针无关)