忘记用了delete释放内存,如何防止内存溢出
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是占位符的意思,和这个智能指针无关)
最新文章
- 深入理解BFC
- CocoaPods的安装、使用、以及遇到的问题
- Vue2.X的状态管理vuex记录
- Asp.net操作cookie大全
- iOS之NSString类中compare方法的陷阱
- iOS之03-类的合理设计
- 线性时间的排序算法--桶排序(以leetcode164. Maximum Gap为例讲解)
- Hibernate 的配置文件
- mysql给日期增减
- cordova android ios
- recursive - simple screenshot but detail principle.
- C#名单:一个简单的实现
- POJ 1426 Find The Multiple(数论——中国同余定理)
- php simpleXML操作xml的用法
- Nginx 出现 403 Forbidden 最终解决
- 将小程序的logo换成属于自己的头像
- 【LeetCode每天一题】String to Integer (atoi)(字符串转换成数字)
- merge-intervals 合并区间
- 【POJ】2420 A Star not a Tree?(模拟退火)
- Mysql客户端中文乱码问题解决