也就是说,为什么 C++ 支持的一些操作能够违反静态(编译时)类型安全机制?
- 为了直接访问硬件(例如,把整数当作指向设备寄存器的指针)
- 为了获取最佳的运行时效率和空间效率(例如,不检测访问数组元素的操作(是否越界),
不检测访问对象的指针(是否有效))
- 为了和 C 兼容
所以,当你并不需要以上三种特性时,最好避免有如瘟疫般的不安全代码:
- 不要用类型转换(cast),
- 不要将数组用作接口(如有必要,请将它们隐藏于高效函数和类的内部,而使用合适的 string、
vector 等编写其余代码),
- 避免 void*(如果你真的需要它们,请将它们限制于低级 (low-level) 函数和数据结构的内部,
并且为用户提供类型安全的接口(通常是模版 (template))),
- 避免联合体(union),
- 如果你对指针的有效性存有任何怀疑,请用智能指针(smart pointer),
- 不要“赤裸裸”地使用 new 和 delete(使用容器,资源句柄等),
- 不要使用 ...风格的函数(例如 printf)。
几乎所有 C++ 代码都能遵循这些简单的规则。请不要因为你编写 C 代码或者 C 风格的 C++ 代码时不能遵循这些规则而认为 C++ 不安全。
原文地址:http://www.research.att.com/~bs/bs_faq.html#unsafe
本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 Bjarne Stroustrup 翻译:antigloss 共同所有,转载请注明原作者和出处。谢谢。