终止前清理?

时间:2012-11-16 18:44:25

标签: c# c++ garbage-collection dispose

这个问题一直困扰着我:我已经在MSDN的DirectX article中阅读了以下内容:

  

析构函数(应用程序的)应该释放存储的任何(Direct2D)接口......

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

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

随着时间的推移,我越来越多地看到这一点,这显然真的让我烦恼。 上面的MSDN文章是我第一次遇到这个问题,所以提到所有其他情况都是有意义的。

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

  • 我需要在终止前释放一些东西吗? (请解释原因请)
  • 为什么MSDN中的作者选择这样做呢?
  • 答案是否与本机和答案不同?托管代码? I.E.在编写C#程序时,是否需要确保在程序结束时处理掉所有内容? (我不知道Java,但如果存在处置,我相信其他成员也会很感激答案)。

谢谢!

2 个答案:

答案 0 :(得分:3)

当您的应用程序终止时,您无需担心托管内容。当整个过程的记忆被拆除时,所有这一切都伴随着它。

重要的是非托管资源。

如果您对文件进行了锁定,并且在应用程序关闭时关闭了文件处理程序的托管包装,而您没有释放锁定,那么您现在已经丢弃了允许访问该文件的唯一密钥。

如果您有内部缓冲区(比如记录错误),您可能希望在应用程序终止之前刷新它。不这样做可能意味着不会记录导致应用程序结束的致命错误。那可能是......糟糕。

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

答案 1 :(得分:3)

  

现在,如果所有应用程序的数据都被释放/解除分配   在终止(来源)为什么我会经历麻烦   一个函数按顺序到/并单独释放它们?

有很多原因。一个直接原因是因为并非所有资源都是内存。只有内存在进程终止时被回收。如果您的某些资源是共享互斥锁或文件句柄之类的东西,那么不释放这些资源可能会破坏其他程序或后续运行程序。

我认为有一个更重要,更根本的原因。不清理自己只是懒惰,草率编程。如果你在终止时清理懒散和邋in,你是否懒惰和其他时候马虎?如果你的倾向是懒惰和邋and的,只有在你认识到潜在问题的特定领域才能超越这种倾向,那么你的倾向就是懒惰和邋。。如果有潜在的问题你不认识怎么办?你如何依靠懒惰,草率编程的整体哲学来编写正确,健壮的程序?

不要那个人。自己清理干净。