﻿<?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++博客-oyrp-文章分类-c++ 技巧</title><link>http://www.cppblog.com/oyrp/category/12371.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 04 Dec 2009 20:46:44 GMT</lastBuildDate><pubDate>Fri, 04 Dec 2009 20:46:44 GMT</pubDate><ttl>60</ttl><item><title>WM_ACTIVE的消息参数</title><link>http://www.cppblog.com/oyrp/articles/102368.html</link><dc:creator>纳兰伴月</dc:creator><author>纳兰伴月</author><pubDate>Tue, 01 Dec 2009 18:26:00 GMT</pubDate><guid>http://www.cppblog.com/oyrp/articles/102368.html</guid><wfw:comment>http://www.cppblog.com/oyrp/comments/102368.html</wfw:comment><comments>http://www.cppblog.com/oyrp/articles/102368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/oyrp/comments/commentRss/102368.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oyrp/services/trackbacks/102368.html</trackback:ping><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">WM_ACTIVE的消息参数</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">wParam的低阶word指示窗口是被激活还是失去激活：</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">WA_ACTIVE，被鼠标点击以外的方法激活；</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">WA_CLICKACTIVE，由鼠标点击激活；</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">WA_INACTIVE，失去激活；</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">wParam的高阶word指示窗口是否被最小化；</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">非零表示最小化；</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">lPararm表示将激活的窗口句柄(WA_INACTIVE)，或者将失去激活的窗口句柄(WA_CLICKACTIVE、WA_ACTIVE)。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">在标准Windows消息处理的章节中，曾指出处理WM_ACTIVE消息时，先要调用一个函数_AfxHandleActivate，此函数的原型如下：</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　static void AFXAPI _AfxHandleActivate(CWnd* pWnd,</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　WPARAM nState,CWnd* pWndOther)</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　其中：</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　参数1是接收消息的窗口；</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　参数2是窗口状态，为WM_ACTIVE的消息参数wParam;</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　参数3是WM_ACTIVE的消息参数lParam表示的窗口。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　_AfxHandleActivate是MFC内部使用的函数，声明和实现均在WinCore.CPP文件中。实现如下：</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　如果pWnd指向的窗口不是子窗口，而且pWnd和pWndOther窗口的顶级父窗口(TopLevelParent)不是同一窗口，则发送MFC定义的消息WM_ACTIVATETOPLEVEL给pWnd的顶级窗口，消息参数wParam是nState，消息参数lParam指向一个长度为二的数组，数组里存放pWnd和pWndOther所指窗口的句柄。否则，_AfxHandleActivate不作什么。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　从这里可以看出：只有顶层的主边框窗口能处理WM_ACTIVE消息，事实上，Windows系统只会给顶层的非子窗口发送WM_ACTIVE消息。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　WM_ACTIVATETOPLEVEL消息的处理</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　CWnd及派生类CFrameWnd实现了对WM_ACTIVATETOPLEVEL消息的处理，分别解释如下：</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　消息处理函数CWnd::OnActivateTopLevel如果失去激活，则取消工具栏的提示（TOOLTIP）。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　消息处理函数CFrameWnd::OnActivateTopLevel调用CWnd的OnActivateTopLevel；如果接收WM_ACTIVE消息的窗口是线程主窗口，则使得其活动的视窗口变成非活动的（OnActive(FALSE, pActiveView,pActiveView)。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　从这里可以知道，在顶层窗口接收到WM_ACTIVE消息后，MFC会进行一些固定的处理，然后才调用WM_ACTIVE消息处理函数。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　WM_ACTIVE消息的处理</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　在_AfxHandleActivate和WM_ACTIVATETOPLEVEL消息处理完之后，才是对WM_ACTIVE的处理。CWnd和CFrameWnd都实现了消息处理。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　CWnd的消息处理函数：</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　void CWnd::OnActive(UINT nState, CWnd* pWndOther, BOOL bMinimized)</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　其中：</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　参数1取值为WA_INACTIVE/WA_ACTIVE/WA_CLICKACTIVE；</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　参数2指向激活或者失去激活的窗口，具体同WM_ACTIVE消息；</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　参数3表示是否最小化。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　此函数的实现是调用Default()，作缺省处理。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　CFrameWnd的消息处理函数：</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　void CFrameWnd::OnActive(UINT nState,CWnd* pWndOther, BOOL bMinimized)</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　首先调用CWnd::OnActivate。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　如果活动视非空，消息是WA_ACTIVE/WA_CLICKACTIVE，并且不是最小化，则重新激活当前视，调用了以下函数：</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　pActiveView-&gt;OnActiveView(TRUE，pActiveView，pActiveView)；</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　并且，如果活动视非空，通知它边框窗口状态的变化（激活/失去激活），调用以下函数：</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">　　pActiveView-&gt;OnActivateFrame(nState, this)。<br><br>转自：<br><a href="http://blog.csdn.net/iu_81/archive/2007/09/27/1803817.aspx"><u><font color=#0000ff>http://blog.csdn.net/iu_81/archive/2007/09/27/1803817.aspx</font></u></a></p>
</span></span>
<img src ="http://www.cppblog.com/oyrp/aggbug/102368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oyrp/" target="_blank">纳兰伴月</a> 2009-12-02 02:26 <a href="http://www.cppblog.com/oyrp/articles/102368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>heap corruption detected: after normal block 可能的原因 </title><link>http://www.cppblog.com/oyrp/articles/102252.html</link><dc:creator>纳兰伴月</dc:creator><author>纳兰伴月</author><pubDate>Sun, 29 Nov 2009 21:27:00 GMT</pubDate><guid>http://www.cppblog.com/oyrp/articles/102252.html</guid><wfw:comment>http://www.cppblog.com/oyrp/comments/102252.html</wfw:comment><comments>http://www.cppblog.com/oyrp/articles/102252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/oyrp/comments/commentRss/102252.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oyrp/services/trackbacks/102252.html</trackback:ping><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 10pt; COLOR: #000000; LINE-HEIGHT: 18px; FONT-FAMILY: 'Courier New', 宋体; TEXT-ALIGN: left">
<p style="MARGIN: 3px">最近写了点C++的代码,其中也出现过很多奇怪的错误,heap corruption detected就是其中之一,而且这种错误很容易出现,一般出现该错误,在debug中都有大致如下的错误信息:</p>
<p style="MARGIN: 3px">heap corruption detected:<br>after normal block(#xxx) at 0x xxxxxxxx<br>crt detected that the application wrote to menory after end of heap buffer</p>
<p style="MARGIN: 3px">这是典型的内存溢出错误,常在内存的delete处发生,而且一般在debug版本中可能出现,release版本中可能并不报错.</p>
<p style="MARGIN: 3px">出现这个错误的原因一般都是操作new申请的内存溢出,因为在c++中,如果用new分配一段内存,操作的时候改变了该部分的大小,在delete时就会出错.比如说如下部分:<br>char* p=new char[5];<br>strcpy(p,"aaaaa");<br>delete[] p;<br>这段代码就会出错,因为申请了一个size为5的内存,但是strcpy过去了一个size为6的字符串,因此破坏了这个指针,运行debug版本的时候就会出现先前的错误,但是在release版本中,溢出一个字节的内存很有可能是没有错误的,然后潜在的隐患是肯定存在的,因此,我们在debug遇到这样的错误时候一定要仔细检查对new出的指针的操作.</p>
</span></span>
<img src ="http://www.cppblog.com/oyrp/aggbug/102252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oyrp/" target="_blank">纳兰伴月</a> 2009-11-30 05:27 <a href="http://www.cppblog.com/oyrp/articles/102252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单内存泄漏检测方法 解决 Detected memory leaks! 问题</title><link>http://www.cppblog.com/oyrp/articles/102251.html</link><dc:creator>纳兰伴月</dc:creator><author>纳兰伴月</author><pubDate>Sun, 29 Nov 2009 19:57:00 GMT</pubDate><guid>http://www.cppblog.com/oyrp/articles/102251.html</guid><wfw:comment>http://www.cppblog.com/oyrp/comments/102251.html</wfw:comment><comments>http://www.cppblog.com/oyrp/articles/102251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/oyrp/comments/commentRss/102251.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oyrp/services/trackbacks/102251.html</trackback:ping><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 13px; LINE-HEIGHT: 19px; FONT-FAMILY: Tahoma, Arial, Helvetica, sans-serif">
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">我的环境是: XP SP2 . VS2003</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">最近在一个项目中,程序退出后都出现内存泄漏:</p>
<pre class=code style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"><font size=4>Detected memory leaks!
Dumping objects -&gt;
{98500} normal block at 0x05785AD0, 152 bytes long.
Data: &lt;&lt; N       N x 7 &gt; 3C AC 4E 10 00 00 00 00 BC A4 4E 10 78 B6 37 00
Object dump complete.</font></pre>
<pre class=code style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">&nbsp;</pre>
<a style="FONT-SIZE: 0.9em; COLOR: rgb(0,111,247)" href="http://11011.net/software/vspaste"></a>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">而且每次退出都是一样的.泄漏的内存块都是98500.</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">解决方法:</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">1. 在程序开始启动的地方(足够前的地方,只要在泄漏的内存分配的前面)使用代码:</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">_CrtSetBreakAlloc(98500); //98500为上面内存泄漏的块号.</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">2. 然后debug运行,程序自动断点在"内存块98500"分配的位置:</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">&nbsp;</p>
<pre class=code style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"><span style="COLOR: green"><font size=4>/* break into debugger at specific memory allocation */</font></span></pre>
<pre class=code style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"><span style="COLOR: green"></span><font size=4><span style="COLOR: blue">if </span>(_crtBreakAlloc != -1L &amp;&amp; lRequest == _crtBreakAlloc)
_CrtDbgBreak();</font></pre>
<pre class=code style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">&nbsp;</pre>
<a style="FONT-SIZE: 0.9em; COLOR: rgb(0,111,247)" href="http://11011.net/software/vspaste"></a>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">&nbsp;</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">3 .我们已经找到了泄漏的那块内存分配的底层操作的地方了(好拗口!).</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">这个时候我们利用 "调试" &#8211;&gt; "退出" ,快捷键为:"Shift + F11" .</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">跳出当前函数..然后一直往"上"跳,边跳边查看调用栈.直到看到了自己写的代码,例如我的</p>
<pre class=code style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"><font size=4>std::ifstream* origStream = <span style="COLOR: blue">new </span>std::ifstream();</font></pre>
<pre class=code style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">&nbsp;</pre>
<a style="FONT-SIZE: 0.9em; COLOR: rgb(0,111,247)" href="http://11011.net/software/vspaste"></a>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">4 .这个时候我已经可以判断 origStream 分配了内存,但是没有合理释放.处理后再次运行就没有出现内存泄漏了.</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">5.最后,记得把_CrtSetBreakAlloc(98500); 这句话删除掉,不然每次都断点,岂不是烦死..</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">----------------------------------------------------------------------------------------------------------</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">写在后面:</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">关于内存泄漏检测,有一个Visual Leak Detector ,按照它的介绍的确很不错,可以直接具体到代码行指出内存泄漏,但是个人使用了一下,发现debug的速度太慢了,不知道是不是我个人程序的问题.......像上面的泄漏,我用CrtSetBreakAlloc这种简单的方法就足够了....</p>
<p style="MARGIN: 5px auto; TEXT-INDENT: 0px">By: 洪庚伟</p>
转自：<a href="http://www.cnblogs.com/G_Weber/archive/2009/04/15/1436362.html"><u><font color=#0000ff>http://www.cnblogs.com/G_Weber/archive/2009/04/15/1436362.html</font></u></a></span></span>
<img src ="http://www.cppblog.com/oyrp/aggbug/102251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oyrp/" target="_blank">纳兰伴月</a> 2009-11-30 03:57 <a href="http://www.cppblog.com/oyrp/articles/102251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类成员函数作为回调函数 及 static成员</title><link>http://www.cppblog.com/oyrp/articles/101658.html</link><dc:creator>纳兰伴月</dc:creator><author>纳兰伴月</author><pubDate>Sun, 22 Nov 2009 15:17:00 GMT</pubDate><guid>http://www.cppblog.com/oyrp/articles/101658.html</guid><wfw:comment>http://www.cppblog.com/oyrp/comments/101658.html</wfw:comment><comments>http://www.cppblog.com/oyrp/articles/101658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/oyrp/comments/commentRss/101658.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oyrp/services/trackbacks/101658.html</trackback:ping><description><![CDATA[c++中由于函数调用时隐式增加了this指针，所以在callback调用时导致参数个数不一致而出错。<br>成员函数作为回调，可以采用static的方式传递。因为static没有使用this。<br>由于使用static所以在回调函数中<span style="COLOR: red">不能</span>访问类的非static成员，所以需要为类增加一个指向自身的指针。<br>如：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;IMainLoop</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pThis;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">指向自身的指针，因为static不能访问非静态变量，所以通过本指针调用非静态变量。</span></div>
注意使用这个指针前需要<span style="BACKGROUND-COLOR: yellow">全局</span>初始化。<br>格式为：类型 &nbsp;限定符::成员=值<br>如：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">&nbsp;IMainLoop</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;BasicMainLoop::pThis&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">需要全局定义以后才能使用静态成员</span></div>
<img src ="http://www.cppblog.com/oyrp/aggbug/101658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oyrp/" target="_blank">纳兰伴月</a> 2009-11-22 23:17 <a href="http://www.cppblog.com/oyrp/articles/101658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>