忘记用了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是占位符的意思,和这个智能指针无关)
相关文章
- JVM内存与垃圾回收篇第3章运行时数据区概述及线程
- Resin内存马逆袭之路
- 另一种轻量级内存池介绍
- 如何使用Dumpscan扫描和解析内核及内存Dump数据
- 浅谈PostgreSQL消耗的内存计算方法
- 系统小内存运行128M内存下的Linux系统运行之路(128mlinux)
- Java内存模型详解编程语言
- 处理Linux内存管理的日志记录(linux内存日志)
- OpenSSL严重bug允许攻击者读取64k内存,Debian半小时修复
- 如何解决 Linux 内存泄露问题(linux内存泄露)
- Redis:高性能、内存型键值数据库!(redis简介)
- 如何使用 Redis 内存快照功能,保障数据的安全与备份?(redis内存快照)
- 如何查看Redis的内存使用情况? Redis内存大小查看(redis查看内存大小)
- 如何解决PHP里大量数据循环时内存耗尽的问题
- 探究Oracle内存池如何提升数据库性能(oracle的内存池)
- 如何优化MySQL的CPU和内存占用?(mysqlcpu内存)
- 深入理解 Oracle 内存分配策略(oracle内存如何分配)
- 如何解决Redis内存满的问题(怎么看redis内存满了)
- 如何快速掌握Redis的内存使用情况(怎么查看redis的内存)
- 优化Redis内存占用技巧(计算redis使用的内存)
- 如何高效控制Redis内存占用(控制redis内存)
- 如何解决MySQL持续占用内存问题(mysql一直占用内存)
- 如何优化Redis内存配置(如何给redis分配内存)
- php5.2.0内存管理改进
- 访问php时提示内存位置访问无效的解决办法和思路分析