忘记用了delete释放内存,如何防止内存溢出

C++的内存管理还是要自己来做的,自己要进行内存的申请和释放

程序直接kill掉,OS会回收的

但是面试要问到这个问题,其实是想问你别的

RAII,也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源、避免内存泄露的方法。它保证在任何情况下,使用对象时先构造对象,最后析构对象。

资源管理

智能指针(std::shared_ptr和std::unique_ptr)即RAII最具代表的实现,使用智能指针,可以实现自动的内存管理,再也不需要担心忘记delete造成的内存泄漏。毫不夸张的来讲,有了智能指针,代码中几乎不需要再出现delete了。这个特性其实是lambda延伸出来的

根据RAII对资源的所有权可分为常性类型和变性类型,代表者分别是boost:shared_ptr<>和std::auto_ptr<>;从所管资源的初始化位置上可分为外部初始化类型和内部初始化类型。

内存只是资源的一种,在这里我们讨论一下更加广义的资源管理。比如说文件的打开与关闭、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是占位符的意思,和这个智能指针无关)

posted @ 2019-08-05 22:37  暴力都不会的蒟蒻  阅读(813)  评论(0编辑  收藏  举报