Questions tagged «raii»

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

5
Java / C#为什么不能实现RAII?
问题:Java / C#为什么不能实现RAII? 澄清:我知道垃圾收集器不是确定性的。因此,使用当前的语言功能,不可能在范围出口处自动调用对象的Dispose()方法。但是,可以添加这种确定性功能吗? 我的理解: 我认为RAI​​I的实现必须满足两个要求: 1.资源的生存期必须绑定到范围。 2.隐式的。必须在没有程序员明确声明的情况下释放资源。类似于垃圾回收器无需显式语句即可释放内存。“隐含性”仅需要在使用该类时发生。当然,类库创建者必须显式实现析构函数或Dispose()方法。 Java / C#满足点1。在C#中,可以将实现IDisposable的资源绑定到“使用”范围: void test() { using(Resource r = new Resource()) { r.foo(); }//resource released on scope exit } 这不满足第2点。程序员必须将对象明确绑定到特殊的“使用”范围。程序员可能(并且确实)忘记将资源显式绑定到作用域,从而造成泄漏。 实际上,“使用”块已由编译器转换为try-finally-dispose()代码。它具有与try-finally-dispose()模式相同的显式性质。如果没有隐式发布,则作用域的钩子就是语法糖。 void test() { //Programmer forgot (or was not aware of the need) to explicitly //bind Resource to a scope. Resource r …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.