5.3 本章小结

C++是一种静态类型的语言,在C++的发展中,一系列的改进使得C++的类型机制几乎严丝合缝,滴水不漏。而在C++11中,最后的漏网之鱼——枚举,终于也以新增的强类型枚举的方式进行了规范。虽然为了兼容性,旧的枚举语义没有任何改变,但新的强类型枚举可以避免形如名字冲突、隐式向整型转换等诸多问题,所以在使用上更加安全。事实上,现有的标准库中的枚举就已经大量采用了强类型枚举来规避编程中的风险。

而堆分配变量的自动释放从来都是编程者津津乐道的问题。理想情况下,程序员应该总是在栈上分配变量,这样变量能够有效地自动释放。不过现实情况下,很多时候程序员在编程时并不能预期所需内存的使用期,所以程序员还离不开malloc/free或者new/delete的堆式内存分配。在C++98中,用户可以使用智能指针auto_ptr来自动释放内存。C++11中则进一步改进了auto_ptr——程序员可以使用行为更加良好的unique_ptr和shared_ptr/weak_ptr智能指针来进行自动的堆内存释放。虽然unique/shared/weak在概念上比起简单的auto变得复杂了,但是行为上却更加安全(返回右值、调用delete[]等)。程序员应该在C++11中全面使用新的智能指针代替auto_ptr。

而随着编程模型的复杂化,C++语言也在考虑引入全面的垃圾回收。不过在C++11中,全面的垃圾回收这个心愿尚未达成。实际在C++11中的是“最小化”的垃圾回收支持,即定义了什么样的指针对于垃圾回收是安全的,什么样的动作会对垃圾回收造成影响。一旦有了会对垃圾回收造成影响的操作,程序员则可以调用API来通知垃圾回收器代码对于垃圾回收是否可达。事实上,现有情况下,我们并看不到“最小垃圾回收支持”的实质应用,大多数编译器也还没有实现相关的内容,但有了最小的支持,程序员和编译器及库的制作者间的接口也就清晰了。不排除以后有编译器或者库制作者设计出能够实现垃圾回收的、能够编译满足最小垃圾回收支持的C++代码的编译器或库产品。不过,能否实现还需要假以时日。