读Defective C++随笔

不尽知用兵之害者,则不能尽知用兵之利也 ——《孙子兵法》

1.为什么API多用C而不是C++
以前就一直很奇怪,为什么API大都用C的方式提供,即使有C++的接口也只是把C的函数又包一层。既然大家都在用C++的编译器,为什么不直接提供C++的API?当初曾经做过一些编译C++DLL的尝试,印象中只是很麻烦,感觉像是编译器支持不好。其实,最核心的原因在于类的私有成员必须出现在头文件里。每当修改实现时,如果修改了私有成员,那么所有使用该DLL的模块都必须重新编译。这意味着无法独立更新C++ API的DLL。而且API库的使用者必须使用和该API库相同的编译器编译,或者被专门设计成能兼容其DLL的编译器(如以前Borland C++的MFC兼容模式)。所以,API大多要么用C,要么用COM式的纯接口。

2.为什么C++程序大多不使用异常
由于C++加入异常功能较晚,绝大大多数的程序采用了C的返回错误码的方式。这些代码不是异常安全的代码,因为它们不能保证在抛出异常时正确释放内存等资源。异常抛出时会跳转到最近的catch语句,后续的资源释放代码将不会执行。要保证异常安全,所有的堆分配对象指针必须使用smart_ptr或shared_ptr等智能指针对象包装,或者用扩展的try-finally语句显示控制释放。而程序员大多不愿引入更多的麻烦,干脆不用异常。但这也带来一些问题,构造函数和重载运算符函数无法返回错误码,所以只能要求它们保证成功。所以便有了构造函数不要做任何资源分配的训诫。不过,即使使用异常,也不能完全解决构造函数运行出错的问题,因为C++规定,构造函数失败,析构函数不会执行。就是说在构造函数抛出异常前分配的资源将无法释放。

http://blog.csdn.net/nightmare/article/details/2296750

最新文章

  1. CSS动画 防止动画结束后,回归原位
  2. nginx找不到php文件
  3. Dreamweaver 8
  4. 禁止触屏滑动touchmove方法介绍
  5. Exceptionin thread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArray(II[BI[BIILjav
  6. 【Android - 框架】之XBanner的使用
  7. Android Branch and master source code merge(patch)
  8. 老李分享:《Linux Shell脚本攻略》 要点(一)
  9. python学习之路web框架续
  10. 如何缩放SpriteBuilder中的scene
  11. 如何能快速的成为一个年薪20万的Java程序员,你都需要具备哪些技术?史上最全的java学习路线!
  12. faiss索引基于数量级和内存限制的选择
  13. ajax成功后XML 解析错误:格式不佳
  14. oracle中order by造成分页错误
  15. 51nod 1459 迷宫游戏 dijkstra模板
  16. (转帖)CentOS最常用命令及快捷键整理
  17. Python2.7-zipfile
  18. Hadoop生态圈-HBase性能优化
  19. spring底层原理解析
  20. phpcms 缓存模板文件

热门文章

  1. 深入浅出MFC:对话框消息路由
  2. QT5.8.0+MSVC2015安装以及环境配置(不需要安装VS2015)
  3. WPF 获得当前输入法语言区域
  4. Arcgis api for javascript学习笔记(4.5版本) - 本地部署及代理配置
  5. 用 AJAX 读取xml 节点属性值
  6. Android中WebView的相关使用
  7. WPF中取得预定义颜色
  8. BZOJ 1483 HNOI2009 梦幻布丁 名单+启示录式的合并
  9. ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程
  10. UVA 10641 - Barisal Stadium(DP + 几何)