﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C++ Space</title><link>http://www.cppblog.com/Kooyu-Gql/</link><description>C++, 3DGame</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 23:33:35 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 23:33:35 GMT</pubDate><ttl>60</ttl><item><title>关于DLL中对象的动态创建与删除的问题</title><link>http://www.cppblog.com/Kooyu-Gql/archive/2007/04/20/22370.html</link><dc:creator>Kooyu</dc:creator><author>Kooyu</author><pubDate>Fri, 20 Apr 2007 05:35:00 GMT</pubDate><guid>http://www.cppblog.com/Kooyu-Gql/archive/2007/04/20/22370.html</guid><wfw:comment>http://www.cppblog.com/Kooyu-Gql/comments/22370.html</wfw:comment><comments>http://www.cppblog.com/Kooyu-Gql/archive/2007/04/20/22370.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/Kooyu-Gql/comments/commentRss/22370.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Kooyu-Gql/services/trackbacks/22370.html</trackback:ping><description><![CDATA[<p>最近有看到一些文章讨论怎样轻松的使用DLL，其中有一个错误，那就是在DLL中创建的对象未在DLL中删除，如下示：</p>
<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: #008000">//</span><span style="COLOR: #008000">someheadfile.h</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">memory</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">class</span><span style="COLOR: #000000">&nbsp;__declspec(dllexport)&nbsp;Interface<br><img id=Codehighlighter1_73_110_Open_Image onclick="this.style.display='none'; Codehighlighter1_73_110_Open_Text.style.display='none'; Codehighlighter1_73_110_Closed_Image.style.display='inline'; Codehighlighter1_73_110_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_73_110_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_73_110_Closed_Text.style.display='none'; Codehighlighter1_73_110_Open_Image.style.display='inline'; Codehighlighter1_73_110_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_73_110_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_73_110_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;virtual&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;foo()&nbsp;</span><span style="COLOR: #000000">=</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><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">class</span><span style="COLOR: #000000">&nbsp;__declspec(dllexport)&nbsp;Impl&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Interface<br><img id=Codehighlighter1_166_205_Open_Image onclick="this.style.display='none'; Codehighlighter1_166_205_Open_Text.style.display='none'; Codehighlighter1_166_205_Closed_Image.style.display='inline'; Codehighlighter1_166_205_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_166_205_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_166_205_Closed_Text.style.display='none'; Codehighlighter1_166_205_Open_Image.style.display='inline'; Codehighlighter1_166_205_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_166_205_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_166_205_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;virtual&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;foo()<br><img id=Codehighlighter1_202_203_Open_Image onclick="this.style.display='none'; Codehighlighter1_202_203_Open_Text.style.display='none'; Codehighlighter1_202_203_Closed_Image.style.display='inline'; Codehighlighter1_202_203_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_202_203_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_202_203_Closed_Text.style.display='none'; Codehighlighter1_202_203_Open_Image.style.display='inline'; Codehighlighter1_202_203_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_202_203_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_202_203_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><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>__declspec(dllexport)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>std::auto_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Impl</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;DLLCreate()<br><img id=Codehighlighter1_263_305_Open_Image onclick="this.style.display='none'; Codehighlighter1_263_305_Open_Text.style.display='none'; Codehighlighter1_263_305_Closed_Image.style.display='inline'; Codehighlighter1_263_305_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_263_305_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_263_305_Closed_Text.style.display='none'; Codehighlighter1_263_305_Open_Image.style.display='inline'; Codehighlighter1_263_305_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_263_305_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_263_305_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;std::auto_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Impl</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Impl);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<span id=Codehighlighter1_166_205_Closed_Text><span id=Codehighlighter1_263_305_Closed_Text><span id=Codehighlighter1_202_203_Closed_Text><span id=Codehighlighter1_166_205_Closed_Text><span id=Codehighlighter1_263_305_Closed_Text><span id=Codehighlighter1_73_110_Open_Text><span id=Codehighlighter1_166_205_Open_Text><span id=Codehighlighter1_202_203_Open_Text><span id=Codehighlighter1_263_305_Open_Text><br>上面的做法貌似可以做到自动删除动态生成的对象，但，只有DLL和用户都动态链接C/C++运行库时它才会运行正确，否则，创建和删除会在不同的堆栈空间进行，从而导致错误&nbsp;<span>。<br>所以还是老实的在提供一个</span><span>DLLDelete()</span><span>用于删除在</span><span>DLL</span><span>中生成的对象。</span><br><br></span></span></span></span></span></span></span></span></span>
<img src ="http://www.cppblog.com/Kooyu-Gql/aggbug/22370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Kooyu-Gql/" target="_blank">Kooyu</a> 2007-04-20 13:35 <a href="http://www.cppblog.com/Kooyu-Gql/archive/2007/04/20/22370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个浮点数表示产生的问题</title><link>http://www.cppblog.com/Kooyu-Gql/archive/2007/04/03/21129.html</link><dc:creator>Kooyu</dc:creator><author>Kooyu</author><pubDate>Mon, 02 Apr 2007 16:27:00 GMT</pubDate><guid>http://www.cppblog.com/Kooyu-Gql/archive/2007/04/03/21129.html</guid><wfw:comment>http://www.cppblog.com/Kooyu-Gql/comments/21129.html</wfw:comment><comments>http://www.cppblog.com/Kooyu-Gql/archive/2007/04/03/21129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Kooyu-Gql/comments/commentRss/21129.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Kooyu-Gql/services/trackbacks/21129.html</trackback:ping><description><![CDATA[半夜里刚睡着又被电话叫醒，一个项目的现场数据出现了错误。<br>我们的程序要分析的报告里的某一个字段使用了定点小数的表示方法，即两个字节表示整数部分，再两个字节表示小数部分。刚开始的时候没注意到这里有个问题，那就是这种表示法要求小数部分一定是定长的，否则，就无法解析。例如，0.03和0.30的表示不同在哪里，0.30可不可以表示成0.300。怪我当初考虑欠佳，失败。
<img src ="http://www.cppblog.com/Kooyu-Gql/aggbug/21129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Kooyu-Gql/" target="_blank">Kooyu</a> 2007-04-03 00:27 <a href="http://www.cppblog.com/Kooyu-Gql/archive/2007/04/03/21129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACE_CDR::mb_align(ACE_Message_Block * mb)使用问题</title><link>http://www.cppblog.com/Kooyu-Gql/archive/2007/03/09/19500.html</link><dc:creator>Kooyu</dc:creator><author>Kooyu</author><pubDate>Fri, 09 Mar 2007 07:33:00 GMT</pubDate><guid>http://www.cppblog.com/Kooyu-Gql/archive/2007/03/09/19500.html</guid><wfw:comment>http://www.cppblog.com/Kooyu-Gql/comments/19500.html</wfw:comment><comments>http://www.cppblog.com/Kooyu-Gql/archive/2007/03/09/19500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Kooyu-Gql/comments/commentRss/19500.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Kooyu-Gql/services/trackbacks/19500.html</trackback:ping><description><![CDATA[
		<p>ACE_CDR::mb_align(ACE_Message_Block * mb)用于对齐mb内部数据块ACE_Data_Block所拥有的内存的起始地址，它的实现大致如下：</p>
		<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">void<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />ACE_CDR::mb_align (ACE_Message_Block </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">mb)<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" />  char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">const</span>
				<span style="COLOR: #000000"> start </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> ACE_ptr_align_binary(mb</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">base (),   ACE_CDR::MAX_ALIGNMENT);<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" />  mb</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">rd_ptr (start);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  mb</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">wr_ptr (start);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}</span>
		</div>
		<p>由于要执行内存地址对齐，那么mb-&gt;base()所指示的地址可能需要向后移动(MAX_ALIGMENT - mb-&gt;base() % MAX_ALIGMENT)个字节。但在这个之后，mb-&gt;base()指向的可用内存将比它自己薄记的少，如果需要程序正常运行，那么依赖于在往它写入数据时，写入的字节数不能大于实际大小(这个实际大小为 ：mb的薄记大小-移动的距离)，而这需要由程序员来控制，容易出错也就难免了。<br /><br />也许可以在函数mb_align内部重设mb的大小，使其薄记大小与实际有效内存大小相符，但这引起内存拷贝，这个代价也太大了。<br /><br />内存对齐的处理似乎应该在内存分配阶段，比如提供类似下面的分配已对齐地址功能的分配器：</p>
		<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">struct Align_Alloc<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" />    void </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> align_alloc(size_t size, unsigned align)<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" />        void </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> ptr </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> char[size </span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000"> align];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        return align_mb_ptr(ptr, align);<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>
		</div>
		<p>但ACE实际上没这么做，它提供mb_align这个与内存分配毫不相干的功能，且希望由程序员自己来解决可能引发的问题！~<br /> </p>
<img src ="http://www.cppblog.com/Kooyu-Gql/aggbug/19500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Kooyu-Gql/" target="_blank">Kooyu</a> 2007-03-09 15:33 <a href="http://www.cppblog.com/Kooyu-Gql/archive/2007/03/09/19500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>"危险"的函数指针类型的强制转换</title><link>http://www.cppblog.com/Kooyu-Gql/archive/2007/03/07/19358.html</link><dc:creator>Kooyu</dc:creator><author>Kooyu</author><pubDate>Wed, 07 Mar 2007 05:38:00 GMT</pubDate><guid>http://www.cppblog.com/Kooyu-Gql/archive/2007/03/07/19358.html</guid><wfw:comment>http://www.cppblog.com/Kooyu-Gql/comments/19358.html</wfw:comment><comments>http://www.cppblog.com/Kooyu-Gql/archive/2007/03/07/19358.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Kooyu-Gql/comments/commentRss/19358.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Kooyu-Gql/services/trackbacks/19358.html</trackback:ping><description><![CDATA[
		<p>查看一个与别人合作的项目的代码，发现了一个“隐秘”的问题，模拟这个问题如下：</p>
		<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">typedef void (</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">foo_type)(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #0000ff">int</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" />void foo1(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #0000ff">int</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" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void foo2()<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" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> main()<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" />  foo_type f 1</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">foo1;                      // &lt;1&gt;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  foo_type f 2</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> (foo_type)</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">foo2;   // &lt;2&gt;<br />     return 0;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}</span>
		</div>语句&lt;1&gt;肯定是对的，语句&lt;2&gt;强转一个函数类型到foo_type类型，我当时担心这会不会导致下面的语句导致运行时错误：<br /><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">(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">f2)(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);</span></div><p>幸运时这里它不会导致错误，这是由于：<br />&lt;1&gt;我们使用C/C++的默认函数调用方式__cdecl，也就是传入的函数参数是由调用者清理的；<br />&lt;2&gt;函数foo2没有使用任何参数。<br />这种做法肯定不值得提倡，但实际的项目中要避免还是不太容易，毕竟每个人的习惯不一样，还有为了与框架协同工作，有时候可能也不得不这样做。但是，一旦函数调用方式发生改变，或者被强转的那个函数是带参数的，而它又使用了这些参数，隐秘的错误也就埋下了。</p><img src ="http://www.cppblog.com/Kooyu-Gql/aggbug/19358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Kooyu-Gql/" target="_blank">Kooyu</a> 2007-03-07 13:38 <a href="http://www.cppblog.com/Kooyu-Gql/archive/2007/03/07/19358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实在让人无法忍受</title><link>http://www.cppblog.com/Kooyu-Gql/archive/2007/03/06/19291.html</link><dc:creator>Kooyu</dc:creator><author>Kooyu</author><pubDate>Tue, 06 Mar 2007 05:17:00 GMT</pubDate><guid>http://www.cppblog.com/Kooyu-Gql/archive/2007/03/06/19291.html</guid><wfw:comment>http://www.cppblog.com/Kooyu-Gql/comments/19291.html</wfw:comment><comments>http://www.cppblog.com/Kooyu-Gql/archive/2007/03/06/19291.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/Kooyu-Gql/comments/commentRss/19291.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Kooyu-Gql/services/trackbacks/19291.html</trackback:ping><description><![CDATA[C++ = VC++ = MFC/ATL/COM<br />我已经记不清多少次看到与此类似甚至比这更离谱的关于C++的表述，真是害人不浅，特别是对C++新手而言。<br />还有一些C++的半调子动辄批评、讽刺他们一知半解的C++特性，拿C++与另一种毫不相干的语言大肆比较，得出稀奇古怪的结论。<br /><br />一些气话，心情不好。<img src ="http://www.cppblog.com/Kooyu-Gql/aggbug/19291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Kooyu-Gql/" target="_blank">Kooyu</a> 2007-03-06 13:17 <a href="http://www.cppblog.com/Kooyu-Gql/archive/2007/03/06/19291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>