﻿<?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++博客-中国勇士-X-随笔分类-C &amp; C++</title><link>http://www.cppblog.com/zgysx/category/2789.html</link><description>抒写快乐心情</description><language>zh-cn</language><lastBuildDate>Mon, 21 Jan 2013 13:12:34 GMT</lastBuildDate><pubDate>Mon, 21 Jan 2013 13:12:34 GMT</pubDate><ttl>60</ttl><item><title>游戏中内存泄漏的查找</title><link>http://www.cppblog.com/zgysx/archive/2013/01/19/197413.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Sat, 19 Jan 2013 08:04:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2013/01/19/197413.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/197413.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2013/01/19/197413.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/197413.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/197413.html</trackback:ping><description><![CDATA[<div><p><font class="Apple-style-span" color="#0000ff" size="2">&nbsp; &nbsp; &nbsp;</font>我们的这款游戏从开发到上线至今已有大概4年了，昨天发现代码中有new出来的对象没有delete，程序退出后VS输出栏中居然没有提示，难道程序中没有内存泄漏检察？进一步的求证确定了我的担忧（我是半路进的项目组）。在代码中加上_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)  |  _CRTDBG_LEAK_CHECK_DF)后，VS的输出栏赫然显示了大量的内存泄漏。在动手解决内存泄漏之前，先复习一下有关new操作符重载的相关知识：</p> <p>new 操作符按其可见性可分为全局的与局部的(类成员)，我们可以对他们进行重载，下面是VS 2010中new.cpp中new操作符的声明</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">(&nbsp;size_t&nbsp;size&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">1</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;(&nbsp;size_t&nbsp;size,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nBlockUse,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;szFileName,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nLine&nbsp;);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">2</span></div><p><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">调用第1个new</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;(&nbsp;_NORMAL_BLOCK,&nbsp;__FILE__,&nbsp;__LINE__&nbsp;)&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">调用第2个new</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">}</span></div> <p>调用new时，传入的参数比new声明时的参数少了一个，即第一个参数，该参数是new的对象的大小，由编译器填写，禁止程序员自己插手。</p> <p>&nbsp;</p> <p>对一个类重载new和delete</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Student<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">(&nbsp;size_t&nbsp;size&nbsp;)&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">3</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;__FUNCTION__&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;malloc(&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(Student)&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /></span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">Student&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Student();&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">调用Student类内部的new，即第3个new</span></div><p>&nbsp;</p> <p>当我们new一个自定义类时，如果该类重载了new操作符，则优先使用该类内部定义的new，如果这时非要调用全局的new操作符怎么办呢？可以在new前面加两个冒号:</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">pS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;::</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Student();&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">调用全局的new，第1个new</span></div><p>&nbsp;</p> <p>下面回到解决内存泄漏的步骤上：</p> <p>1 在程序必定会执行的路径上加上：</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;_CRTDBG_LEAK_CHECK_DF);</span></div> <p>不一定非得是程序的最开始处<br /><br /></p> <p>2 使用上面给出的第2个new操作符，当程序退出时，它会在VS输出栏中注明是哪行代码引起的内存泄漏。即所有的new 都改为</p><div style="display: inline-block; "></div><span class="Apple-style-span" style="font-size: 13px; background-color: #eeeeee; "><span style="color: #0000ff; ">new</span><span style="color: #000000; ">&nbsp;(&nbsp;_NORMAL_BLOCK,&nbsp;__FILE__,&nbsp;__LINE__&nbsp;)</span></span><p>&nbsp;</p> <p>完了。。。。。这样就可以了。<br /></p> <p>但是，我们程序已有的代码都写的是new，而不是new ( _NORMAL_BLOCK, __FILE__, __LINE__ )。</p> <p><br />MFC中的解决方法：</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;new&nbsp;&nbsp;new&nbsp;(&nbsp;_NORMAL_BLOCK,&nbsp;__FILE__,&nbsp;__LINE__&nbsp;)</span></div> <p>这样好像是可以解决问题，但是我们游戏中用了Gamebryo游戏引擎，这个引擎中很多类内部重载了new操作符，并且还有如下的宏定义：</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;NiNew&nbsp;new(&nbsp;NI_MEMHINT_NONE,&nbsp;__FILE__,&nbsp;__LINE__&nbsp;,&nbsp;__FUNCTION__&nbsp;)</span></div> <p>并且引擎自带的对象都是通过NiNew来创建的，如&nbsp;<span class="Apple-style-span" style="font-size: 13px; background-color: #eeeeee; ">NiNew&nbsp;NiAlphaProperty();</span></p> <p>如果我们把new 宏定义成了new ( _NORMAL_BLOCK, __FILE__, __LINE__ )，那么碰到NiNew  NiAlphaProperty()后，代码就被展开成为</p> <p><span class="Apple-style-span" style="font-size: 13px; background-color: #eeeeee; "><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;(&nbsp;_NORMAL_BLOCK,&nbsp;__FILE__,&nbsp;__LINE__&nbsp;)&nbsp;&nbsp;(&nbsp;NI_MEMHINT_NONE,&nbsp;__FILE__,&nbsp;__LINE__&nbsp;,&nbsp;__FUNCTION__&nbsp;)&nbsp;NiAlphaProperty();&nbsp;</span></span>当编译器尝试着用此代码与NiAlphaProperty类内部定义的new操作符去匹配时就抓瞎了，只能报错。</p> <p>目前就只能自己再定义一个宏:</p><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;New&nbsp;&nbsp;&nbsp;::new&nbsp;(&nbsp;_NORMAL_BLOCK,&nbsp;__FILE__,&nbsp;__LINE__&nbsp;)</span></div> <p>将代码中所有的new替换成New。<br /><br /><strong>另一种内存泄漏检测方法就是借用第3方的库</strong>:<br />Visual Leak Detector 是一个不错的泄漏检测库，下载地址：<br /><a href="http://vld.codeplex.com/releases/view/82311">http://vld.codeplex.com/releases/view/82311</a><br />只需要在自己的程序的main函数所在的文件中#include &lt;vld.h&gt;就可以了，使用起来很方便。</p> <p>(注: _CrtSetBreakAlloc()对大型的C++工程不太实用 )</p></div><img src ="http://www.cppblog.com/zgysx/aggbug/197413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2013-01-19 16:04 <a href="http://www.cppblog.com/zgysx/archive/2013/01/19/197413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于fscanf读取文件的问题</title><link>http://www.cppblog.com/zgysx/archive/2008/07/28/57354.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Mon, 28 Jul 2008 07:29:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2008/07/28/57354.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/57354.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2008/07/28/57354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/57354.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/57354.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">比如读取以以下格式存放在文件中的字符串,可采用fscanf<br><br></span><span style="color: #000000;">1000</span><span style="color: #000000;">,小明,团员,湖北武昌XXXX<br></span><span style="color: #000000;">1001</span><span style="color: #000000;">,张华,党员,湖北宜昌XXXX<br><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif">.<br><br><br>FILE&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;fp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fopen(&nbsp;pszFilePath,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">r</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">while</span><span style="color: #000000;">(&nbsp;n&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">feof(&nbsp;fp&nbsp;)&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nID;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;szName[</span><span style="color: #000000;">100</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">0</span><span style="color: #000000;">};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;szBelong[</span><span style="color: #000000;">100</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">0</span><span style="color: #000000;">};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;szAddress[</span><span style="color: #000000;">300</span><span style="color: #000000;">]&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">0</span><span style="color: #000000;">};<br>&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fscanf(&nbsp;fp,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">%d,%[^','],%[^','],%s\r\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">nID,&nbsp;szName,&nbsp;szBelong,&nbsp;szAddress);<br></span><span style="color: #008000;">//</span><span style="color: #008000;"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif">.</span><span style="color: #008000;"><br></span><span style="color: #000000;">}</span></div>
<br><br><img src ="http://www.cppblog.com/zgysx/aggbug/57354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2008-07-28 15:29 <a href="http://www.cppblog.com/zgysx/archive/2008/07/28/57354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C++反汇编揭秘1 一个简单的C++程序反汇编解析</title><link>http://www.cppblog.com/zgysx/archive/2008/07/17/56382.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Thu, 17 Jul 2008 02:15:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2008/07/17/56382.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/56382.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2008/07/17/56382.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/56382.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/56382.html</trackback:ping><description><![CDATA[<p>本系列主要从汇编角度研究C++语言机制和汇编的对应关系。第一篇自然应该从最简单的开始。C++的源代码如下：</p>
<p>
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: rgb(219,229,241) 0% 50%; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 7.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid" vAlign=top width=734>
            <div style="MARGIN-BOTTOM: 0pt">class my_class</div>
            <div style="MARGIN-BOTTOM: 0pt">{</div>
            <div style="MARGIN-BOTTOM: 0pt">public :</div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp; my_class()</span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp; {</span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_member = 1;</span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp; }</span></div>
            <div style="MARGIN-BOTTOM: 0pt">&nbsp;</div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp; void method(int n)</span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp; {</span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_member = n;</span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp; }</span></div>
            <div style="MARGIN-BOTTOM: 0pt">&nbsp;</div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp; ~my_class()</span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp; {</span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_member = 0;</span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp; &nbsp;}</span></div>
            <div style="MARGIN-BOTTOM: 0pt">&nbsp;</div>
            <div style="MARGIN-BOTTOM: 0pt">private :</div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp; int m_member;</span></div>
            <div style="MARGIN-BOTTOM: 0pt">};</div>
            <div style="MARGIN-BOTTOM: 0pt">&nbsp;</div>
            <div style="MARGIN-BOTTOM: 0pt">int _tmain(int argc, _TCHAR* argv[])</div>
            <div style="MARGIN-BOTTOM: 0pt">{</div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp; my_class a_class;</span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp; a_class.method(10);</span></div>
            <div style="MARGIN-BOTTOM: 0pt">&nbsp;</div>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp; return 0;</span></div>
            <div style="MARGIN-BOTTOM: 0pt">}</div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<div>&nbsp;</div>
<div>可以直接Debug的时候看到Assembly代码，不过这样获得的代码注释比较少。比较理想的方法是利用VC编译器的一个选项/FAs来生成对应的汇编代码。/FAs还会在汇编代码中加入注释注明和C++代码的对应关系，十分有助于分析。Build代码便可以在输出目录下发现对应的.ASM文件。本文将逐句分析汇编代码和C++的对应关系。</div>
<div>首先是WinMain：</div>
<p>
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: rgb(219,229,241) 0% 50%; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 7.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid" vAlign=top width=734>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">_TEXT<span> SEGMENT</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">_wmain<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PROC</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>保存旧的ebp</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ebp, esp&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ebp</span>保存当前栈的位置</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;-1&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>建立SEH(Structured Exception Handler)链</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; -1</span>表示表头,没有Prev</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;__ehhandler$_wmain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; SEH</span>异常处理程序的地址</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, DWORD PTR fs:0&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; fs:0</span>指向TEB的内容，头4个字节是当前SEH链的地址</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;eax&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>保存起来</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; esp, d8H&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>分配d8H字节的空间</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;ebx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;esi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;edi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; edi, DWORD PTR [ebp-e4H]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; e4H = d8H + 4 * 3</span>，跳过中间ebx, esi, edi</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, 36H&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 36H*4H=d8H</span>，也就是用36H个ccccccccH填满刚才分配的d8H字节空间</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, ccccccccH</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rep stosd</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, DWORD PTR ___security_cookie&nbsp;&nbsp; </font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp; eax, ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;eax&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ebp ^ __security_cookie</span>压栈保存</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; eax, DWORD PTR [ebp-0cH]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ebp-0cH</span>是新的SEH链的结构地址（刚压入栈中的栈地址）</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; DWORD PTR fs:0, eax&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>设置到TEB中作为当前Active的SEH链表末尾</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<div>&nbsp;</div>
<div>到此为止栈的内容是这样的：</div>
<div>低地址</div>
<p>
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: rgb(219,229,241) 0% 50%; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 161.6pt; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid" vAlign=top width=215>
            <div style="MARGIN-BOTTOM: 0pt">Security cookie after XOR</div>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: 1pt solid; WIDTH: 161.6pt; PADDING-TOP: 0in; BORDER-BOTTOM: 1pt solid" vAlign=top width=215>
            <div style="MARGIN-BOTTOM: 0pt">Edi</div>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: 1pt solid; WIDTH: 161.6pt; PADDING-TOP: 0in; BORDER-BOTTOM: 1pt solid" vAlign=top width=215>
            <div style="MARGIN-BOTTOM: 0pt">Esi</div>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: 1pt solid; WIDTH: 161.6pt; PADDING-TOP: 0in; BORDER-BOTTOM: 1pt solid" vAlign=top width=215>
            <div style="MARGIN-BOTTOM: 0pt">Ebx</div>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: 1pt solid; WIDTH: 161.6pt; PADDING-TOP: 0in; BORDER-BOTTOM: 1pt solid" vAlign=top width=215>
            <div style="MARGIN-BOTTOM: 0pt">Local stack: d8H</div>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: 1pt solid; WIDTH: 161.6pt; PADDING-TOP: 0in; BORDER-BOTTOM: 1pt solid" vAlign=top width=215>
            <div style="MARGIN-BOTTOM: 0pt">Old fs:0</div>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: 1pt solid; WIDTH: 161.6pt; PADDING-TOP: 0in; BORDER-BOTTOM: 1pt solid" vAlign=top width=215>
            <div style="MARGIN-BOTTOM: 0pt">__ehhandler$_wmain</div>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: 1pt solid; WIDTH: 161.6pt; PADDING-TOP: 0in; BORDER-BOTTOM: 1pt solid" vAlign=top width=215>
            <div style="MARGIN-BOTTOM: 0pt">ffffffffH</div>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: 1pt solid; WIDTH: 161.6pt; PADDING-TOP: 0in; BORDER-BOTTOM: 1pt solid" vAlign=top width=215>
            <div style="MARGIN-BOTTOM: 0pt">Old ebp</div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<div>&nbsp;高地址</div>
<div>main接着后面调用my_class的构造函数</div>
<p>
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: rgb(219,229,241) 0% 50%; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 7.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid" vAlign=top width=734>
            <div style="MARGIN-BOTTOM: 0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">lea&nbsp;&nbsp; ecx, DWORD PTR [ebp-14H]</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;call&nbsp;??0my_class@@QAE@XZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>调用my_class::my_class, ??my_class@@QAE@XZ是经过Name Mangling后的名字</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp; DWORD PTR [ebp-4], 0&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>进入__try块，在Main中有一个隐式的__try/__except块</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<div>&nbsp;</div>
<div>接着调用my_class::method</div>
<p>
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: rgb(219,229,241) 0% 50%; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 7.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid" vAlign=top width=734>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>参数入栈</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; ecx, DWORD PTR [ebp-14H]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>遵循thiscall调用协定，ecx存放的是this指针</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;?method@my_class@@QAEXH@Z&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>调用子程序my_class:method(10)</font></div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<div>&nbsp;</div>
<div>之后是析构：</div>
<p>
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: rgb(219,229,241) 0% 50%; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 7.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid" vAlign=top width=734>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; DWORD PTR [ebp-e0H], 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>用来放置返回值</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; DWORD PTR [ebp-4], -1&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>标记TRY的正常结束</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; ecx, DWORD PTR [ebp-14H]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; a_class</span>的地址作为this存入ECX</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;??1my_class@@QAE@XZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; my_class::~my_class</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, DWORD PTR [ebp-e0H]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>返回值按照约定放入eax中</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<div>&nbsp;</div>
<div>Main函数退出代码如下：</div>
<p>
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: rgb(219,229,241) 0% 50%; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 7.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid" vAlign=top width=734>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;edx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, ebp</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;eax</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; edx, DWORD PTR $LN7@wmain</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;@_RTC_CheckStackVars@8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>检查栈</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; eax</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; edx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, DWORD PTR [ebp-0cH]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>取出之前保存的旧的fs:0，并恢复</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; DWORD PTR fs:0, ecx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; ecx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; edi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; esi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; ebx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; esp, e4H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>退掉分配的d8H + 建立SEH链所需的0cH字节</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp; ebp, esp</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;__RTC_CheckEsp&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>检查esp值，这个时候esp应该和ebp匹配，否则说明出现了栈不平衡的情况，这种情况下调用子程序报错</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; esp, ebp&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>恢复ebp到esp</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; ebp&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>恢复原来的ebp值</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret&nbsp;&nbsp; 0</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">_wmain<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDP</span></font></div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<div>&nbsp;</div>
<div>专门用于SEH的子程序。__unwindfunclet$_wmain$0当异常发生的时候被调，负责进行栈展开，主要是调用析构函数。__ehhandler$_wmain则是在exception被抛出的时候调用。</div>
<p>
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: rgb(219,229,241) 0% 50%; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 7.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid" vAlign=top width=734>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">Text$x<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEGMENT</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">__unwindfunclet$_wmain$0:<span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>当SEH发生的时候会调用该函数，析购a_class</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; ecx, DWORD PTR [ebp-14H]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ecx = [ebp &#8211; 14H]</span>，也就是a_class的地址</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; ??1my_class@@QAE@XZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>调用my_class::~my_class</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">__ehhandler$_wmain:</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; edx, DWORD PTR [esp+8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; esp = </span>当前的fs:0, [esp + 8] = 之前的SEH结构，也就是main中建立的</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; eax, DWORD PTR [edx+0cH]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; edx + 0Ch = </span>当前的ebp，也就是main的ebp，此时不能直接使用ebp因为可能会从任意函数调过来，此时ebp是该函数的ebp，而不是main的ebp</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, DWORD PTR [edx-e0H]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>之前存下去的__security_cookie ^ ebp</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp; ecx, eax&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>再次和ebp相异或</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;@__security_check_cookie@4&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>此时ecx应该等于__security_cookie，否则说明栈的内容被恶意改动（或者编程错误）</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, OFFSET __ehfuncinfo$_wmain</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; ___CxxFrameHandler3</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">text$x<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDS</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt">&nbsp;</div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<div>&nbsp;</div>
<div>My_class::my_class构造函数如下。构造函数本质上就是一个全局函数，名字是经过打乱的(Name Mangling)，这样可以和同一Class和其他Class的同名方法区别开来。不同编译器有不同规则，因此不必过于深究。</div>
<p>
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: rgb(219,229,241) 0% 50%; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 7.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid" vAlign=top width=734>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">_TEXT</font><span><font face="Courier New"> SEGMENT<br>??0my_class@@QAE@XZ PROC</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>保存旧的ebp</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ebp, esp&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ebp</span>保存当前栈的位置</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; esp, ccH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>给栈分配ccH个字节</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;ebx&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>保存常用寄存器</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;esi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;edi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;ecx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; edi, DWORD PTR [ebp-ccH]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>从分配的位置开始</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, 33H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>写33H个ccccccccH</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, ccccccccH&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>也就是33H*4H=ccH，正好是分配的大小</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rep stosd&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>从而把整个栈上当前分配的空间用ccH填满</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; ecx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; DWORD PTR [ebp-8], ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>按照约定，一般用ECX保存this指针</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>把this存入到ebp-8，并不是很必要，因为这是Debug版本</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">; 10<span>&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp; {</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">; 11<span>&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_member = 1;</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, DWORD PTR [ebp-8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; eax</span>中存放this</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; DWORD PTR [eax], 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; this</span>的头四个byte是m_member的内容</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">; 12<span>&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp; }</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, DWORD PTR [ebp-8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>多余的一句话，可以优化掉</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; edi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; esi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; ebx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; esp, ebp&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>恢复esp，因此就算是中间栈运算出错，最后也不会导致灾难性的结果，只要ebp还是正确的</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; ebp</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret&nbsp;&nbsp; 0</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">??0my_class@@QAE@XZ ENDP</font></div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<div>&nbsp;</div>
<div>My_class::method的实现如下：</div>
<p>
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: rgb(219,229,241) 0% 50%; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 7.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid" vAlign=top width=734>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">_TEXT<span> SEGMENT</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">?method@my_class@@QAEXH@Z PROC<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; my_class::method</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">; 15<span>&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp; {</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;ebp</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ebp, esp</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; esp, ccH</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;ebx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;esi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;edi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;ecx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; edi, DWORD PTR [ebp-ccH]</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, 33H</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, ccccccccH</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rep stosd</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; ecx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; DWORD PTR [ebp-8], ecx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">; 16<span>&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_member = n;</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, DWORD PTR [ebp-8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; eax</span>中存放this</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, DWORD PTR [ebp+8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ebp -&gt; ebp</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ebp + 4 -&gt; IP </font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ebp + 8 -&gt; n</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>把n存入ecx中</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; DWORD PTR [eax], ecx&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; this</span>头四个字节是m_member, 因此这句话就是m_member = n</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">; 17<span>&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp; }</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; edi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; esi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; ebx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; esp, ebp</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; ebp</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; </span>等价于</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ret </span>恢复EIP，返回调用地址</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; add esp, 4 -&gt; </span>把n从栈上Pop掉</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">?method@my_class@@QAEXH@Z ENDP</font></div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<div>&nbsp;</div>
<div>最后的析构函数，和前面的代码并无区别。</div>
<p>
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: rgb(219,229,241) 0% 50%; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 7.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid" vAlign=top width=734>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">_TEXT<span> SEGMENT</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">??1my_class@@QAE@XZ PROC<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; my_class::~my_class</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">; 20<span>&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp; {</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;ebp</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ebp, esp</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; esp, 204&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;ebx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;esi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;edi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;ecx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; edi, DWORD PTR [ebp-204]</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, 33H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, ccccccccH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rep stosd</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; ecx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; DWORD PTR _this$[ebp], ecx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">; 21<span>&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_member = 0;</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, DWORD PTR [ebp-8]</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; DWORD PTR [eax], 0</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">; 22<span>&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp; }</span></font></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">&nbsp;</font></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; edi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; esi</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; ebx</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; esp, ebp</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; ebp</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><span><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret&nbsp;&nbsp; 0</font></span></div>
            <div style="MARGIN-BOTTOM: 0pt"><font face="Courier New">??1my_class@@QAE@XZ ENDP<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; my_class::~my_class</span></font></div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.cppblog.com/zgysx/aggbug/56382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2008-07-17 10:15 <a href="http://www.cppblog.com/zgysx/archive/2008/07/17/56382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写可变参数函数</title><link>http://www.cppblog.com/zgysx/archive/2008/07/08/55609.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Tue, 08 Jul 2008 03:35:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2008/07/08/55609.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/55609.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2008/07/08/55609.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/55609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/55609.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdarg.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">varargs.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Format(wchar_t&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;psz,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;)<br><img id=Codehighlighter1_132_299_Open_Image onclick="this.style.display='none'; Codehighlighter1_132_299_Open_Text.style.display='none'; Codehighlighter1_132_299_Closed_Image.style.display='inline'; Codehighlighter1_132_299_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_132_299_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_132_299_Closed_Text.style.display='none'; Codehighlighter1_132_299_Open_Image.style.display='inline'; Codehighlighter1_132_299_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_132_299_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_132_299_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;ap;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;wchar_t&nbsp;message[</span><span style="COLOR: #000000">1024</span><span style="COLOR: #000000">] = {0};&nbsp;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;va_start(ap,psz);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;vswprintf(message,psz,ap);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;va_end(ap);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;wprintf(L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;message);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br><img id=Codehighlighter1_340_413_Open_Image onclick="this.style.display='none'; Codehighlighter1_340_413_Open_Text.style.display='none'; Codehighlighter1_340_413_Closed_Image.style.display='inline'; Codehighlighter1_340_413_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_340_413_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_340_413_Closed_Text.style.display='none'; Codehighlighter1_340_413_Open_Image.style.display='inline'; Codehighlighter1_340_413_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_340_413_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_340_413_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;wchar_t&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">abc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Format(L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;p,&nbsp;a);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>输出为:abc10
<img src ="http://www.cppblog.com/zgysx/aggbug/55609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2008-07-08 11:35 <a href="http://www.cppblog.com/zgysx/archive/2008/07/08/55609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重载(overload)，覆盖(override),隐藏(hide)的区别</title><link>http://www.cppblog.com/zgysx/archive/2007/03/12/19662.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Mon, 12 Mar 2007 13:47:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2007/03/12/19662.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/19662.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2007/03/12/19662.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/19662.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/19662.html</trackback:ping><description><![CDATA[写正题之前，先给出几个关键字的中英文对照，重载(overload)，覆盖(override),隐藏(hide)。在早期的C++书籍中，可能翻译的人不熟悉专业用语（也不能怪他们，他们不是搞计算机编程的，他们是英语专业的），常常把重载(overload)和覆盖(override)搞错！
<p>　　我们先来看一些代码及其编译结果。</p><p>　　实例一:<br />　　#include "stdafx.h"<br />　　#include &lt;iostream.h&gt;</p><p>　　class CB<br />　　{<br />　　public:<br /> 　　　　<font color="#ff0000">void f(int)<br /></font> 　　　　{<br /> 　　　　　　 cout &lt;&lt; "CB::f(int)" &lt;&lt; endl;<br />　　　　 }</p><p>　　};</p><p><br />　　class CD : public CB<br />　　{<br />　　public:<br />　　　　 <font color="#ff0000">void f(int,int)<br /></font> 　　　　{<br />  　　　　　　cout &lt;&lt; "CD::f(int,int)" &lt;&lt; endl;<br /> 　　　　}</p><p> 　　　　void test()<br /> 　　　　{<br />  　　　　　f(1);<br /> 　　　　}<br />　　};</p><p>　int main(int argc, char* argv[])<br />　{<br />　　　 return 0;<br />　}<br />编译了一下<br />error C2660: 'f' : function does not take 1 parameters</p><p><br />结论：在类CD这个域中，没有f(int)这样的函数，基类中的void f(int)被<font color="#ff0000">隐藏</font></p><p>　　如果把派生CD中成员函数void f(int,int)的声明改成和基类中一样，即f(int)，基类中的void f(int)还是一样被覆盖，此时编译不会出错，在函数中test调用的是CD中的f(int)　</p><p>　　所以，在<font color="#ff0000">基类中</font>的某些函数，如果<font color="#ff0000">没有</font><font color="#ff0000">virtral</font>关键字，函数名是<font color="#ff0000">f(</font>参数是什么我们不管)，那么如果在派生类CD中<font color="#ff0000">也声明了某个f</font>成员函数，那么在类CD域中，<font color="#ff0000">基类中所有的那些f都被隐藏。</font><br />　　如果你比较心急，想知道什么是隐藏，看文章最后的简单说明，不过我建议你还是一步一步看下去。</p><p>　　我们刚才说的是没有virtual的情况，如果有virtual的情况呢？？<br />　　实例二：</p><p>#include "stdafx.h"<br />#include &lt;iostream.h&gt;</p><p>class CB<br />{<br />public:<br /> 　　<font color="#ff0000">virtual void f(int)<br /></font> 　　{<br />  　　　　cout &lt;&lt; "CB::f(int)" &lt;&lt; endl;<br /> 　　}</p><p>};</p><p><br />class CD : public CB<br />{<br />public:<br />　　 <font color="#ff0000">void f(int)<br /></font> 　　{<br />  　　　　cout &lt;&lt; "CD::f(int)" &lt;&lt; endl;<br />　　 }</p><p>};</p><p>int main(int argc, char* argv[])<br />{<br /> 　return 0;<br />}</p><p>　　这么写当然是没问题了，在这里我不多费口舌了，这是很简单的，多态，虚函数，然后什么指向基类的指针指向派生类对象阿，通过引用调用虚函数阿什么的，属性多的很咯，什么？？你不明白？？随便找本C++的书，对会讲多态和虚函数机制的哦！！<br />　　这种情况我们叫<font color="#ff0000">覆盖(override)！</font>覆盖指的是派生类的虚拟函数覆盖了基类的同名且参数相同的函数！<br />　　在这里，我要强调的是，这种覆盖，要满足两个条件<br />　<font size="4">(a)</font><font color="#ff0000">有virtual关键字</font>，在基类中函数声明的时候加上就可以了<br />　<font size="4">(b)</font>基类CB中的函数和派生类CD中的函数<font color="#ff0000">要一模一样</font>，什么叫一模一样，<font color="#ff0000">函数名，参数，返回类型三个条件</font>。<br />　　有人可能会对(b)中的说法质疑，说返回类型也要一样？？<br />　　是，覆盖的话必须一样，我试了试，如果在基类中,把f的声明改成virtual int f(int)，编译出错了<br />　　error C2555: 'CD::f' : overriding virtual function differs from 'CB::f' only by return type or calling convention<br />　　所以，覆盖的话，必须要满足上述的(a)(b)条件</p><p>　　那么如果基类CB中的函数f有关键字virtual　，但是参数和派生类CD中的函数f参数不一样呢，<br />实例三:<br />  #include "stdafx.h"<br />#include &lt;iostream.h&gt;</p><p>class CB<br />{<br />　public:<br /> 　　 virtual  void f(int)<br />　　 {<br /> 　　　　 cout &lt;&lt; "CB::f(int)" &lt;&lt; endl;<br />　　 }</p><p>}<br />;</p><p><br />class CD : public CB<br />{<br />public:<br /> 　　 void f(int，int)<br /> 　　{<br /> 　　　 cout &lt;&lt; "CD::f(int，int)" &lt;&lt; endl;<br /> 　　}</p><p> 　　void test()<br /> 　　{<br /> 　　　　 f(1);<br /> 　　}<br />}<br />;</p><p>int main(int argc, char* argv[])<br />{<br /> return 0;<br />}</p><p>编译出错了，<br /> error C2660: 'f' : function does not take 1 parameters<br />　　咦？？好面熟的错？？对，和实例一中的情况一样哦，结论也是基类中的函数被隐藏了。</p><p>　　通过上面三个例子，得出一个简单的结论<br />如果<font color="#ff0000">基类中的函数和派生类中的两个名字一样的函数f</font><br />满足下面的两个条件<br /><font size="4">(a)在基类中函数声明的时候有virtual关键字<br />(b)基类CB中的函数和派生类CD中的函数一模一样，函数名，参数，返回类型都一样。<br />那么这就是叫做<font color="#ff0000">覆盖(override)，</font>这也就是虚函数，多态的性质</font></p><p><font size="4">那么其他的情况呢？？只要名字一样，不满足上面覆盖的条件，就是<font color="#ff0000">隐藏</font>了。</font></p><p><font size="4">下面我要讲最关键的地方了</font>，好多人认为，基类CB中的f(int)会继承下来和CD中的f(int,int)在派生类CD中构成重载，就像实例一中想像的那样。<br />　　对吗？我们先看重载的定义<br />　　<font color="#ff0000">重载(overload):<br /></font>　　必须在一个域中,函数名称相同但是函数参数不同,重载的作用就是同一个函数有不同的行为,因此不是在一个域中的函数是无法构成重载的,这个是重载的重要特征<br />　　<font color="#ff0000" size="4">必须在一个域中</font>，而继承明显是在两个类中了哦，所以上面的想法是不成立的，我们测试的结构也是这样，派生类中的f(int,int)把基类中的f(int)隐藏了<br />　　所以，<font color="#ff0000">相同的函数名的函数，在基类和派生类中的关系只能是覆盖或者隐藏。</font></p><p>　　在文章中，我把重载和覆盖的定义都给了出来了，但是一直没有给隐藏的定义，在最后，我把他给出来，这段话是网上google来的，比较长，你可以简单的理解成，在派生类域中，看不到基类中的那个同名函数了，或者说，是并没有继承下来给你用，呵呵，如实例一　那样。<br />　　</p><p><font color="#ff0000">隐藏(hide):<br /></font>指的是派生类的成员函数隐藏了基类函数的成员函数.隐藏一词可以这么理解:在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定义,如果找到了那么就停止查找了,所以如果一个派生类和一个基类都有同一个<font style="BACKGROUND-COLOR: #ffffff" color="#ff0000">同名</font>(暂且不论参数是否相同)的函数,而编译器最终选择了在派生类中的函数,那么我们就说这个派生类的成员函数"隐藏"了基类的成员函数,也就是说它阻止了编译器继续向上查找函数的定义.</p><img src ="http://www.cppblog.com/zgysx/aggbug/19662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2007-03-12 21:47 <a href="http://www.cppblog.com/zgysx/archive/2007/03/12/19662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>