browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

关于内存/资源泄漏

Posted by on 2006 年 02 月 21 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

内存泄漏对于没有垃圾自动回收机制的程序设计语言来说,当然是个永恒的话题。由于这阵子的工作一直在关注这方面的内容,所以把这之中需要注意的一些东西简要地列举出来,希望能对大家有所帮助,也供自己日后参考之用。

1、申请资源后要注意释放,比如malloc之后一定要free,new之后一定要delete,这是最老掉牙的一条规则了。

2、如果在类中申请了资源,别忘了在类的析构函数中做好收尾工作。

3、注意new/delete、new[]/delete[]的配对使用,如果把由new[]申请的内存交由delete释放,则会造成内存不完全释放,依然是泄漏。

—以下是Windows平台下的注意事项—

4、调用API函数创建了新句柄之后一定要在不需要使用的时候释放它。通常Create打头的函数都是需要回收的,MSDN上对这些函数都会介绍对应哪个函数来释放资源。常用的释放函数有DestroyIcon、DeleteObject、CloseHandle。

5、在GDI中,对于开辟的DC一定要调用对应的释放函数来释放该DC。

6、在GDI绘图工作结束时,要记得恢复原始环境,否则会造成旧有资源(如原有画笔或画刷)的丢失。

7、SetTimer创建的计时器不用的时候一定要记着KillTimer。

8、某些函数在使用的时候要特别注意。比如ImageList加入图像的过程是一个拷贝的过程,所以在加入图像后可以将原有的图像资源释放。另外诸如ExtractIcon、SHGetFileInfo获取的图标也是需要用DestroyIcon释放的。

此外许还有,欢迎补充。

订阅本站

5 Comments

  • At 2006.02.21 22:46, adorp said:

    好! ATL的GUI设计咋不更新呢?

    • At 2006.02.21 22:50, adorp said:

      “—以下是Windows平台下的注意事项—”

      应准确地说是资源泄露, 所以文章标题应改成”关于内存/资源泄漏”更为妥当些, 呵, 啰唆了:)

      • At 2006.02.22 08:58, 李马 said:

        工作忙,内容已经想出来了,等这段工作结束后再把新一章写出来吧。

        • At 2006.02.23 09:16, 李马 said:

          补充一点,不要迷信BoundsChecker,它只是使用了API挂钩技术来进行逻辑上的判断。像上边的7、8点它是找不出来的。

          • At 2013.09.09 16:33, 关于内存/资源泄漏 | DJ在这儿 said:

            […] 此文转载自:http://blog.titilima.com/show-108-1.html […]

            (Required)
            (Required, will not be published)