﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><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>C++博客-玩心未泯-随笔分类-C/C++</title><link>http://www.cppblog.com/kerlw/category/3989.html</link><description>卡尔斯希普拉斯</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 12:26:13 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 12:26:13 GMT</pubDate><ttl>60</ttl><item><title>回头读读代码，或许有潜伏的小问题你需要纠正——记一次内存泄露问题的排查</title><link>http://www.cppblog.com/kerlw/archive/2007/07/05/27545.html</link><dc:creator>SuperPlayeR</dc:creator><author>SuperPlayeR</author><pubDate>Thu, 05 Jul 2007 10:20:00 GMT</pubDate><guid>http://www.cppblog.com/kerlw/archive/2007/07/05/27545.html</guid><wfw:comment>http://www.cppblog.com/kerlw/comments/27545.html</wfw:comment><comments>http://www.cppblog.com/kerlw/archive/2007/07/05/27545.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/kerlw/comments/commentRss/27545.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kerlw/services/trackbacks/27545.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 工程里面发生内存泄露，经过排查，最后发现发生的地方居然是老工程中一个很老很重要的的文件了，居然一直没有发现。&nbsp;&nbsp;<a href='http://www.cppblog.com/kerlw/archive/2007/07/05/27545.html'>阅读全文</a><img src ="http://www.cppblog.com/kerlw/aggbug/27545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kerlw/" target="_blank">SuperPlayeR</a> 2007-07-05 18:20 <a href="http://www.cppblog.com/kerlw/archive/2007/07/05/27545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用VS中的宏(Marco)功能来帮助你工作</title><link>http://www.cppblog.com/kerlw/archive/2007/06/29/27204.html</link><dc:creator>SuperPlayeR</dc:creator><author>SuperPlayeR</author><pubDate>Fri, 29 Jun 2007 05:25:00 GMT</pubDate><guid>http://www.cppblog.com/kerlw/archive/2007/06/29/27204.html</guid><wfw:comment>http://www.cppblog.com/kerlw/comments/27204.html</wfw:comment><comments>http://www.cppblog.com/kerlw/archive/2007/06/29/27204.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kerlw/comments/commentRss/27204.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kerlw/services/trackbacks/27204.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: VS中的宏功能是我一直没有用过的，昨天碰巧碰到个事情，要修改一个4万8千多行的文件，这个超大文件还只是这个project中的最大的一个，还有另外几个加起来估计也有好几万行，而修改的东西其实不多，可以说是很多种替换操作的集合就可以完成的。不用宏更待何时？&nbsp;&nbsp;<a href='http://www.cppblog.com/kerlw/archive/2007/06/29/27204.html'>阅读全文</a><img src ="http://www.cppblog.com/kerlw/aggbug/27204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kerlw/" target="_blank">SuperPlayeR</a> 2007-06-29 13:25 <a href="http://www.cppblog.com/kerlw/archive/2007/06/29/27204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#中调用C++的dll的参数为指针类型的导出函数（包括二级指针的情况）</title><link>http://www.cppblog.com/kerlw/archive/2007/06/27/27061.html</link><dc:creator>SuperPlayeR</dc:creator><author>SuperPlayeR</author><pubDate>Wed, 27 Jun 2007 09:05:00 GMT</pubDate><guid>http://www.cppblog.com/kerlw/archive/2007/06/27/27061.html</guid><wfw:comment>http://www.cppblog.com/kerlw/comments/27061.html</wfw:comment><comments>http://www.cppblog.com/kerlw/archive/2007/06/27/27061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kerlw/comments/commentRss/27061.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kerlw/services/trackbacks/27061.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 严格来说这篇文章算不上C++范围的，不过还是挂了点边，还是在自己的blog中记录一下吧。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/kerlw/archive/2007/06/27/27061.html'>阅读全文</a><img src ="http://www.cppblog.com/kerlw/aggbug/27061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kerlw/" target="_blank">SuperPlayeR</a> 2007-06-27 17:05 <a href="http://www.cppblog.com/kerlw/archive/2007/06/27/27061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>你也许不知道的#define用法</title><link>http://www.cppblog.com/kerlw/archive/2007/04/20/22381.html</link><dc:creator>SuperPlayeR</dc:creator><author>SuperPlayeR</author><pubDate>Fri, 20 Apr 2007 08:39:00 GMT</pubDate><guid>http://www.cppblog.com/kerlw/archive/2007/04/20/22381.html</guid><wfw:comment>http://www.cppblog.com/kerlw/comments/22381.html</wfw:comment><comments>http://www.cppblog.com/kerlw/archive/2007/04/20/22381.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/kerlw/comments/commentRss/22381.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kerlw/services/trackbacks/22381.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 似乎从学会C语言开始就知道使用define了，很久很久了，但是今天却碰到一个从来没见过的define用法，也许你也没见过呢？来，容我慢慢道来。&nbsp;&nbsp;<a href='http://www.cppblog.com/kerlw/archive/2007/04/20/22381.html'>阅读全文</a><img src ="http://www.cppblog.com/kerlw/aggbug/22381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kerlw/" target="_blank">SuperPlayeR</a> 2007-04-20 16:39 <a href="http://www.cppblog.com/kerlw/archive/2007/04/20/22381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>探索Heap Corruption</title><link>http://www.cppblog.com/kerlw/archive/2007/04/12/21700.html</link><dc:creator>SuperPlayeR</dc:creator><author>SuperPlayeR</author><pubDate>Thu, 12 Apr 2007 03:44:00 GMT</pubDate><guid>http://www.cppblog.com/kerlw/archive/2007/04/12/21700.html</guid><wfw:comment>http://www.cppblog.com/kerlw/comments/21700.html</wfw:comment><comments>http://www.cppblog.com/kerlw/archive/2007/04/12/21700.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kerlw/comments/commentRss/21700.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kerlw/services/trackbacks/21700.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前些天写程序的时候遇到了HeapCorruption，当时对这个问题一知半解，发表了篇随笔，今天有空以vc6编译器做做研究，写下探索的结果大家分享一下。&nbsp;&nbsp;<a href='http://www.cppblog.com/kerlw/archive/2007/04/12/21700.html'>阅读全文</a><img src ="http://www.cppblog.com/kerlw/aggbug/21700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kerlw/" target="_blank">SuperPlayeR</a> 2007-04-12 11:44 <a href="http://www.cppblog.com/kerlw/archive/2007/04/12/21700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个不小心引发的Heap corruption</title><link>http://www.cppblog.com/kerlw/archive/2007/04/10/21604.html</link><dc:creator>SuperPlayeR</dc:creator><author>SuperPlayeR</author><pubDate>Tue, 10 Apr 2007 09:39:00 GMT</pubDate><guid>http://www.cppblog.com/kerlw/archive/2007/04/10/21604.html</guid><wfw:comment>http://www.cppblog.com/kerlw/comments/21604.html</wfw:comment><comments>http://www.cppblog.com/kerlw/archive/2007/04/10/21604.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kerlw/comments/commentRss/21604.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kerlw/services/trackbacks/21604.html</trackback:ping><description><![CDATA[<p>今天写程序的时候碰到一个问题，调试的时候总是报错Heap corruption detected。一直没碰到过这样的问题，所以实在不知道如何下手。后来偶然一次注释掉一个释放语句，就没报错了Heap corruption detected了（但是报memory leak)，才发现原来这个释放有问题。我的一个函数调用中，开始的时候分配了一个char数组，结束的时候释放这个数组空间，看起来完全是没有问题的，居然会引发Heap corruption detected。代码大体如下：<br>&nbsp;<br>char* pCmd = new char[len+1];&nbsp;&nbsp;&nbsp;// len has got value before<br>memset( pCmd, 0, len+1);<br>.........<br>for(int i=0;i&lt;len;i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ........&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取一个str内容形如："1A", "0F"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sscanf(str, "%02X", &amp;pCmd[i]);<br>}<br>.....<br>delete [] pCmd;<br><br>找到问题的所在，再分析代码才发现了这其中一个很隐蔽的问题，就是那句sscanf，由于第二个参数用的是"%02X"，那么对它而言，最后一个参数就是一个指向int类型的指针了，而我给的实际是一个char的指针。<br>如果上面的循环只进行到i&lt;len-2，或者pCmd的size扩大到len+3，都可以避免heap corruption。<br>后来我干脆用了一个零时的int型变量来完成这个工作。<br><br>要分析这个问题，太理论化的我将不上来，应该是sscanf调用的过程中，由于pCmd分配到的空间不足，因此引发了新的分配，pCmd不再是像声明的那样一个len+1大小的char数组，因此直接调用delete [] pCmd就会引发heap corruption了。到底咋回事，也许还要高人来讲讲。</p>
<img src ="http://www.cppblog.com/kerlw/aggbug/21604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kerlw/" target="_blank">SuperPlayeR</a> 2007-04-10 17:39 <a href="http://www.cppblog.com/kerlw/archive/2007/04/10/21604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>