《凌波微步-软件开发警戒案例集》读书摘要

p18.

  "匈牙利命名法存在很多严重的问题,其中之一是:一旦要修改变量类型,也就必须同时修改变量名称。这一问题,反映在必须保证接口稳定的WIN32 API上,更为棘手。"


p31.

  "几乎所有现代C/C++编译器在处理内存中的数据结构以及sizeof运算符时,默认情况下,都会把类或结构占用的空间大小在8字节边界处对齐,以优化代码的执行速度。

   可以通过预编译命令 #pragma pack (1)来取消这种默认对齐"


p42.

  "定义和实际存储相关的数据结构时,最好不要使用int这种"可变长"的数据类型——int在16位、32位、64位计算机上的字节长度是不同的——相反,使用诸如DWORD这样的定长类型是个不错的选择。"


p66.

  "assert()宏仅在NDEBUG宏无效的情况下才发挥作用,即若定义了NDEBUG宏(软件的releass版本),则assert()宏相当于空语句;若未定义NDEBUG宏(Debug版本),则assert检查参数,参数为假时,输出错误信息并终止程序。

  assert()宏的最大问题是其在软件的release版本中将变为空语句,不起任何作用。

  因此,不要在assert()中写入任何影响程序运行状态的语句,如assert(fp=fopen()),这种用法是错误的。

  另外,对于外部参数(用户输入)不应该用assert()宏来检查有效性,assert()宏应用来检查内部参数(确定因素)。

  MFC中特别提供了一个VERIFY宏,除了能完成assert()的验证功能外,其最大的特点是无论在Debug版还是Release版本中,都永远有效。"


p91.

  "面向对象编程中不容忽视的一个问题:类的构造函数是没有返回值的。

   这个特点使得如果在构造函数中进行资源分配,就必须采取一定办法将分配失败的情况通知调用者,否则就有可能造成内存访问异常。

   解决方法通常有两种:

   一是干脆不在构造函数中进行资源分配,而是在类中实现Initialize()和Uninitialize(),由这两个函数负责资源的释放和分配,返回值类型为bool。
  
   二是利用对象的异常处理机制,当构造函数发生分配错误时,就跑出异常,一旦捕获异常,就不进行后续的工作。"

posted @ 2020-10-20 11:00  陈雨竹  阅读(73)  评论(0)    收藏  举报