5.2.6 垃圾回收的兼容性
尽管在设计C++11标准时想尽可能保证向后兼容,但是对于垃圾回收来说,破坏向后兼容是不可避免的。通常情况下,如果我们想要程序使用垃圾回收,或者可靠的内存泄漏检测,我们就必须做出必要的假设来保证垃圾回收器能工作。而为此,我们必须限制指针的使用或者使用declare_reachable/undeclare_reachable、declare_no_pointer/undeclare_no_pointer来让一些不安全的指针使用免于垃圾回收器的检查。因此想让老的代码毫不费力地使用垃圾回收,现实情况下对大多数代码还是不可能的。
此外,C++11标准中对指针的垃圾回收支持仅限于系统提供的new操作符分配的内存,而malloc分配的内存则会被认为总是可达的,即无论何时垃圾回收器都不予回收。因此使用malloc等的较老代码的堆内存还是必须由程序员自己控制。
而更为现实的状况是在本书写作时,垃圾回收的特性还没有得到任何编译器支持,即使是所谓的“最小垃圾回收”。标准的发展以及垃圾回收在C/C++中的实现可能还需要一定的时间。不过有了最小支持,用户可能在新代码中会注意指针的使用,并对形如指针隐藏的状况使用合适的函数来对被隐藏指针的堆对象进行保护。按照C++的设计,显式地delete使用与垃圾回收并不会形成冲突。如果程序员选择这么做的话,就应该能够保证最大的代码向前兼容性。在未来某个时刻C++垃圾回收支持完成的时候,代码可以直接享受其带来的益处。