我真的很喜欢基于作用域的内存管理(SBMM)或RAII,因为它在C ++社区中更为常见(令人困惑?)。据我所知,除C ++(和C)外,当今没有其他主流语言使SBMM / RAII成为主要的内存管理机制,相反,他们更喜欢使用垃圾回收(GC)。
我觉得这很令人困惑,因为
- SBMM使程序更具确定性(您可以确切地说出销毁对象的时间);
- 在使用GC的语言中,您通常必须执行手动资源管理(例如,参见关闭Java中的文件),这在一定程度上违背了GC的目的,并且也容易出错。
- 堆内存还可以(非常优雅地称为imo)是作用域绑定的(请参见
std::shared_ptr
C ++)。
为什么SBMM没有得到更广泛的使用?它有什么缺点?
finalize()
在垃圾回收之前将调用对象的方法的副作用。实际上,这产生了垃圾回收应该解决的同一类问题。