【发布时间】:2013-08-29 14:38:12
【问题描述】:
所以我刚刚阅读了关于非垃圾收集语言的RAII 模式,而这个section 引起了我的注意:
开发自定义类时通常会遇到此限制。 C# 和 Java 中的自定义类必须显式实现 dispose 方法,以便与客户端代码兼容。 dispose 方法必须包含对属于该类的所有子资源的显式关闭。在具有 RAII 的 C++ 中不存在此限制,其中自定义类的析构函数会自动递归地销毁所有子资源,而无需任何显式代码。
为什么 C++ 可以正确跟踪这些以 RAII 模式分配的资源,但我们却没有使用 C# using 构造获得这个可爱的 Stack Unwinding?
【问题讨论】:
-
您知道 C++ 需要多少年的 auto_ptr、shared_ptr 和类似的东西才能正确使用 RAII 习语和集合? :-)
-
@R.MartinhoFernandes 我知道,这仍然不是 C++,而是 C++ + 的东西。 C++ 本身具有不完整且不完全兼容的库。我们可以整天用“但你应该自己实现 RAII”来玩语义,C++ 作为语法确实可以,但支持的“标准”库并不相同,幸运的是 C# 不需要 10至少在容器和引用方面拥有连贯的库。
-
@xanatos 是否使用 C#?如果没有正确的工具,你如何处理 C++ 中的指针向量?你
delete他们都是手动的吗?你如何在 C# 中处理List<Stream>?您手动关闭(或using)它们?看起来和我很相似。你如何处理一个有List<Stream>成员的类? -
多么好的问题! C# 中有一个 Dispose 模式。让事情变得丑陋,让我想知道 GC 语言的优势。所以更好的相关阅读:msdn.microsoft.com/en-us/library/fs2xkftw.aspx,stackoverflow.com/questions/898828/…