<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语言特工</title><link>http://blog.vckbase.com/arong/category/67.html</link><description>涉及一些语言方面的技巧和特殊技术</description><managingEditor>馨荣家园</managingEditor><dc:language>af</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>馨荣家园</dc:creator><title>内存泄漏问题分析</title><link>http://blog.vckbase.com/arong/archive/2007/06/25/27060.html</link><pubDate>Mon, 25 Jun 2007 09:19:00 GMT</pubDate><guid>http://blog.vckbase.com/arong/archive/2007/06/25/27060.html</guid><wfw:comment>http://blog.vckbase.com/arong/comments/27060.html</wfw:comment><comments>http://blog.vckbase.com/arong/archive/2007/06/25/27060.html#Feedback</comments><slash:comments>41</slash:comments><wfw:commentRss>http://blog.vckbase.com/arong/comments/commentRss/27060.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/arong/services/trackbacks/27060.html</trackback:ping><description>大家经常听到一个名词叫内存泄漏。到底怎样才会遇到内存泄漏，内存泄漏到底该怎么定位，大家却都很糊涂。实际上我对这个问题也很头疼，下面就是我关于这个问题的一些小看法：&lt;BR&gt;&lt;BR&gt;1. 什么叫内存泄漏？&lt;BR&gt;内存泄漏是指你分配了内存，使用完毕后没有正确释放它。这样这个内存就不能再被使用。&lt;BR&gt;&lt;BR&gt;例如：&lt;BR&gt;void test()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;char * p = new char[MAX_PATH];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetModuleFileName(NULL,p, MAX_PATH);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strcat(p+strlen(p) - 3, "txt");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CStdioFile file(p);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.WriteString("text");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.Close();&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;注意：上面的指针p函数退出后就无法再释放，new char[MAX_PATH]分配的内存就泄漏了。&lt;BR&gt;&lt;BR&gt;2. 何时我的程序泄漏了？&lt;BR&gt;从外部看，我们很难100％准确的方法去判断是否有内存泄漏。实际上，一块内存是否被泄漏，从外部看只有当进程结束才能知道。因为你完全可以从开始分配一块内存，直到结束才去释放它。&lt;BR&gt;&lt;BR&gt;基本上，下面行为不能说明内存泄漏：&lt;BR&gt;a) 任务管理器上显示内存使用增加了1MB&lt;BR&gt;b) 内存使用很多（我见过最大内存使用超过1.5GB的程序）&lt;BR&gt;&lt;BR&gt;下面行为可能意味着有内存泄漏：&lt;BR&gt;a) 一个进程的内存使用量按照一个固定的速度稳定的增长（例如每小时增加20MB)&lt;BR&gt;&lt;BR&gt;如果可以在VC IDE中运行程序，当程序退出时，系统会报一堆泄漏错误。&lt;BR&gt;&lt;BR&gt;3. 如何定位&lt;BR&gt;从编译器角度讲，在分配内存后，任何时候释放都是合适的，因此系统不会知道你何时适合去释放内存。在进程运行过程中，你只能估计是否有内存泄漏，而不能确定一定有内存泄漏。一般来说，我们可以用以下一些办法定位：&lt;BR&gt;&lt;BR&gt;a) 使用性能监视器跟踪进程的内存使用情况，如果它在不断增长，且增长速度趋于稳定，一般说明在某个循环性的操作中有内存泄漏&lt;BR&gt;b) 在编译器中按照Debug模式运行程序，运行一定时间后（例如2天），使用正常的方式停止进程&lt;BR&gt;正常情况下，你不会收到任何和内存有关的异常。如果你程序有内存泄漏，你会收到如下错误信息：&lt;BR&gt;&lt;BR&gt;Detected memory leaks!&lt;BR&gt;Dumping objects -&amp;gt;&lt;BR&gt;D:\projects\EnumWnd\EnumWndDlg.cpp(185) : {78} normal block at 0x00421330, 100 bytes long.&lt;BR&gt;&amp;nbsp;Data: &amp;lt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt; CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD &lt;BR&gt;Object dump complete.&lt;BR&gt;&lt;BR&gt;注意，这里EnumWndDlg.cpp(185)应该是分配这块内存的地方。这是因为没有所谓的内存泄漏点，只有在某点分配的内存被泄漏了。&lt;BR&gt;&lt;BR&gt;4. 如何分析内存泄漏&lt;BR&gt;内存泄漏分析一般是通过分析内存生命周期来进行的。你必须对你的内存的可能使用情况有所了解。在此基础上，你应该了解在那个地方内存应该被释放。如果有内存泄漏，说明程序没有走到那个地方，或者释放代码没有正确执行。因此你可能需要跟踪你代码的执行情况，通过分析为什么代码没有按照预期走到内存释放处，了解为什么内存泄漏了。&lt;BR&gt;&lt;BR&gt;常见的原因：&lt;BR&gt;&lt;BR&gt;a) 忘记释放&lt;BR&gt;b) 释放的方法错误&lt;BR&gt;例如：把指针加入诸如CArray之类的集合对象中，释放时应该首先通过delete操作删除指针指向的对象，然后才能去调用诸如RemoveAll函数去释放集合中的指针。单纯析构诸如CArray之类的对象，不会自动释放它所包含的指针所指向的对象。&lt;BR&gt;&lt;BR&gt;c) 析构函数错误：如果你对象中包含指针，那么你析构函数需要正确的释放这些指针。如果你析构函数不做这些，就会有内存泄漏&lt;BR&gt;d) 线程问题：如果线程被你通过TerminateThread中止，那么它所分配的对象一般不会有机会被释放。这是那些喜欢在线程外中止线程的人经常遇到的问题。&lt;BR&gt;&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/arong/aggbug/27060.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>馨荣家园</dc:creator><title>基类定义了operator new，派生类有什么需求</title><link>http://blog.vckbase.com/arong/archive/2007/04/29/25884.html</link><pubDate>Sun, 29 Apr 2007 14:33:00 GMT</pubDate><guid>http://blog.vckbase.com/arong/archive/2007/04/29/25884.html</guid><wfw:comment>http://blog.vckbase.com/arong/comments/25884.html</wfw:comment><comments>http://blog.vckbase.com/arong/archive/2007/04/29/25884.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://blog.vckbase.com/arong/comments/commentRss/25884.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/arong/services/trackbacks/25884.html</trackback:ping><description>&lt;P&gt;一般而言，如果基类定义了operator new，那么派生类也必须对应定义。&lt;BR&gt;考虑下面的两个类&lt;BR&gt;char * pAddress;&lt;BR&gt;class CBase&lt;BR&gt;{&lt;BR&gt;public:&lt;BR&gt;&amp;nbsp;static void* operator new(size_t size){return pAddress;};&lt;BR&gt;&amp;nbsp;static void operator delete(void * p){};&lt;BR&gt;};&lt;/P&gt;
&lt;P&gt;class CDerive:public CBase&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;char buffer[1024];&lt;BR&gt;public:&lt;BR&gt;&amp;nbsp;CDerive()&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;for(int i=0; i &amp;lt; 1024; i ++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer[i] = i %26 + 'a';&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;};&lt;BR&gt;当调用CDerive * p = new CDerive时，编译器首先尝试匹配该类自己的new，由于没有，编译器就尝试匹配在其祖先链上的new,于是调用CBase::operator new&lt;BR&gt;但是基类其实不知道派生类任何信息，它仅仅根据CBase处理，因此构造了一个错误的类对象。&lt;/P&gt;
&lt;P&gt;下面是我的测试代码，你可以发现在delete时程序报告p2指针被破坏，这就是因为CDerive得不到自己的1024字节内容，因此覆盖了后面的内容&lt;/P&gt;
&lt;P&gt;void test()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;char *p1, * p2;&lt;BR&gt;&amp;nbsp;p1 = new char[10];&lt;BR&gt;&amp;nbsp;memset(p1,0,10);&lt;BR&gt;&amp;nbsp;pAddress = new char[sizeof(CBase)];&lt;BR&gt;&amp;nbsp;p2 = new char[10];&lt;BR&gt;&amp;nbsp;memset(p2,0,10);&lt;BR&gt;&amp;nbsp;CDerive *pDerive = new CDerive;&lt;BR&gt;&amp;nbsp;TRACE(_T("%p\n"),pDerive);&lt;BR&gt;&amp;nbsp;delete p1;&lt;BR&gt;&amp;nbsp;delete p2;&lt;BR&gt;&amp;nbsp;delete pAddress;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/arong/aggbug/25884.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>馨荣家园</dc:creator><title>LINK2001 错误常见原因分析</title><link>http://blog.vckbase.com/arong/archive/2004/10/10/966.html</link><pubDate>Sat, 09 Oct 2004 19:53:00 GMT</pubDate><guid>http://blog.vckbase.com/arong/archive/2004/10/10/966.html</guid><wfw:comment>http://blog.vckbase.com/arong/comments/966.html</wfw:comment><comments>http://blog.vckbase.com/arong/archive/2004/10/10/966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/arong/comments/commentRss/966.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/arong/services/trackbacks/966.html</trackback:ping><description>&lt;img src ="http://blog.vckbase.com/arong/aggbug/966.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>馨荣家园</dc:creator><title>论调用约定</title><link>http://blog.vckbase.com/arong/archive/2004/06/09/409.html</link><pubDate>Tue, 08 Jun 2004 16:05:00 GMT</pubDate><guid>http://blog.vckbase.com/arong/archive/2004/06/09/409.html</guid><wfw:comment>http://blog.vckbase.com/arong/comments/409.html</wfw:comment><comments>http://blog.vckbase.com/arong/archive/2004/06/09/409.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://blog.vckbase.com/arong/comments/commentRss/409.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/arong/services/trackbacks/409.html</trackback:ping><description>&lt;img src ="http://blog.vckbase.com/arong/aggbug/409.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>馨荣家园</dc:creator><title>数组和指针</title><link>http://blog.vckbase.com/arong/archive/2004/06/05/371.html</link><pubDate>Fri, 04 Jun 2004 20:19:00 GMT</pubDate><guid>http://blog.vckbase.com/arong/archive/2004/06/05/371.html</guid><wfw:comment>http://blog.vckbase.com/arong/comments/371.html</wfw:comment><comments>http://blog.vckbase.com/arong/archive/2004/06/05/371.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blog.vckbase.com/arong/comments/commentRss/371.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/arong/services/trackbacks/371.html</trackback:ping><description>&lt;img src ="http://blog.vckbase.com/arong/aggbug/371.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>阿荣陋室</dc:creator><title>指针悬挂</title><link>http://blog.vckbase.com/arong/archive/2004/05/29/301.html</link><pubDate>Fri, 28 May 2004 18:13:00 GMT</pubDate><guid>http://blog.vckbase.com/arong/archive/2004/05/29/301.html</guid><wfw:comment>http://blog.vckbase.com/arong/comments/301.html</wfw:comment><comments>http://blog.vckbase.com/arong/archive/2004/05/29/301.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://blog.vckbase.com/arong/comments/commentRss/301.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/arong/services/trackbacks/301.html</trackback:ping><description>&lt;img src ="http://blog.vckbase.com/arong/aggbug/301.html" width = "1" height = "1" /&gt;</description></item></channel></rss>