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是占位符的意思,和这个智能指针无关)

最新文章

  1. 深入理解BFC
  2. CocoaPods的安装、使用、以及遇到的问题
  3. Vue2.X的状态管理vuex记录
  4. Asp.net操作cookie大全
  5. iOS之NSString类中compare方法的陷阱
  6. iOS之03-类的合理设计
  7. 线性时间的排序算法--桶排序(以leetcode164. Maximum Gap为例讲解)
  8. Hibernate 的配置文件
  9. mysql给日期增减
  10. cordova android ios
  11. recursive - simple screenshot but detail principle.
  12. C#名单:一个简单的实现
  13. POJ 1426 Find The Multiple(数论——中国同余定理)
  14. php simpleXML操作xml的用法
  15. Nginx 出现 403 Forbidden 最终解决
  16. 将小程序的logo换成属于自己的头像
  17. 【LeetCode每天一题】String to Integer (atoi)(字符串转换成数字)
  18. merge-intervals 合并区间
  19. 【POJ】2420 A Star not a Tree?(模拟退火)
  20. Mysql客户端中文乱码问题解决

热门文章

  1. python3-常用模块之sys
  2. 【LGP5112】FZOUTSY
  3. ValueError: Variable conv1/weights already exists.
  4. Umount- Linux必学的60个命令
  5. centos7服务器常见安装包准备
  6. 全栈之路-杂篇-前端Http请求封装优化
  7. element-ui 使用笔记
  8. SQL语句中GROUP BY的问题
  9. MySQL系列(一)--基础知识(转载)
  10. 2019阿里云开年Hi购季必抢!爆爆爆爆爆爆爆款清单来了!