这个问题一直困扰着我:我已经在MSDN的DirectX article中阅读了以下内容:
析构函数(应用程序的)应该释放存储的任何(Direct2D)接口......
DemoApp::~DemoApp()
{
SafeRelease(&m_pDirect2dFactory);
SafeRelease(&m_pRenderTarget);
SafeRelease(&m_pLightSlateGrayBrush);
SafeRelease(&m_pCornflowerBlueBrush);
}
现在,如果所有应用程序的数据都在终止时被释放/解除分配(source),为什么我会麻烦地按顺序创建一个函数来/并单独释放它们?没有意义!
随着时间的推移,我越来越多地看到这一点,这显然真的让我烦恼。 上面的MSDN文章是我第一次遇到这个问题,所以提到所有其他情况都是有意义的。
好吧,到目前为止,我实际上并没有问我的问题,这里是:
谢谢!
答案 0 :(得分:3)
当您的应用程序终止时,您无需担心托管内容。当整个过程的记忆被拆除时,所有这一切都伴随着它。
重要的是非托管资源。
如果您对文件进行了锁定,并且在应用程序关闭时关闭了文件处理程序的托管包装,而您没有释放锁定,那么您现在已经丢弃了允许访问该文件的唯一密钥。
如果您有内部缓冲区(比如记录错误),您可能希望在应用程序终止之前刷新它。不这样做可能意味着不会记录导致应用程序结束的致命错误。那可能是......糟糕。
如果您打开了网络连接,则需要关闭它们。如果你不这样做,那么操作系统可能不会为你做这件事(至少暂时不会这样做;最终可能会注意到不活动),这对于另一端的人来说是相当粗鲁的。他们可能会继续听取回复,或继续向您发送信息,而不知道您不再在那里。
答案 1 :(得分:3)
现在,如果所有应用程序的数据都被释放/解除分配 在终止(来源)为什么我会经历麻烦 一个函数按顺序到/并单独释放它们?
有很多原因。一个直接原因是因为并非所有资源都是内存。只有内存在进程终止时被回收。如果您的某些资源是共享互斥锁或文件句柄之类的东西,那么不释放这些资源可能会破坏其他程序或后续运行程序。
我认为有一个更重要,更根本的原因。不清理自己只是懒惰,草率编程。如果你在终止时清理懒散和邋in,你是否懒惰和其他时候马虎?如果你的倾向是懒惰和邋and的,只有在你认识到潜在问题的特定领域才能超越这种倾向,那么你的倾向就是懒惰和邋。。如果有潜在的问题你不认识怎么办?你如何依靠懒惰,草率编程的整体哲学来编写正确,健壮的程序?
不要那个人。自己清理干净。