c# - 终止前清理?

标签 c# c++ garbage-collection dispose

这个问题困扰了我一段时间:我在 MSDN 的 DirectX 中阅读过 article以下内容:

The destructor (of the application) should release any (Direct2D) interfaces stored...

DemoApp::~DemoApp()
{
    SafeRelease(&m_pDirect2dFactory);
    SafeRelease(&m_pRenderTarget);
    SafeRelease(&m_pLightSlateGrayBrush);
    SafeRelease(&m_pCornflowerBlueBrush);
}

现在,如果应用程序的所有数据都在终止时被释放/解除分配(source),我为什么要费力地按顺序创建一个函数/并单独释放它们?这没有意义!

随着时间的推移,我越来越多地看到这种情况,这显然真的让我很烦恼。 上面的 MSDN 文章是我第一次遇到这种情况,因此在所有其他情况下提及它是有意义的。

好吧,到目前为止我实际上并没有问我的问题,它们在这里:

  • 我需要在终止之前发布一些东西吗? (请解释原因)
  • 为什么 MSDN 的作者没有选择这样做?
  • 答案是否不同于 native 代码和托管代码? IE。在编写 C# 程序时,是否需要确保在程序结束时释放所有内容? (我不了解 Java,但如果存在处置方式,我相信其他成员也会对此给予答复)。

谢谢!

最佳答案

当您的应用程序终止时,您无需担心托管内容。当整个进程的内存被拆除时,所有这些都随之消失。

重要的是非托管资源。

如果您锁定了一个文件,并且当应用程序关闭而您没有释放锁定时,文件处理程序的托管包装器被取下,那么您现在已经丢弃了允许访问该文件的唯一 key 。

如果您有一个内部缓冲区(比如用于记录错误),您可能希望在应用程序终止之前刷新它。不这样做可能意味着导致应用程序结束的 fatal error 未被记录。那可能……很糟糕。

如果您打开了网络连接,则需要关闭它们。如果你不这样做,那么操作系统可能不会为你做这件事(至少暂时不会;最终它可能会注意到不活动),这对另一端的人来说是相当粗鲁的。他们可能会继续收听回应,或者继续向您发送信息,而不知道您已经不在了。

关于c# - 终止前清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13422528/

相关文章:

c++ - 如何高效初始化大类对象

c++ - Qt 的 foreach 中的第二项是否仅评估一次?

c++ - :bad_alloc in passing vector reference to pointer to vector in constructor

python - 迭代数据库结果时如何在应用程序引擎(python)中收集内存垃圾

c# - OLEDB 安全异常

C# 基类型列表添加通用子实例

Java 垃圾收集器 : How is "Desired Survivor Size" calculated?

以最少的分配进行垃圾收集器开销?

c# - 如何使用 C# 在回车时拆分字符串?

c# - 在 C# 中 'bool = bool != true' 是什么意思?