﻿<?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++博客-LINGSUIYU'S BLOG</title><link>http://www.cppblog.com/lingsuiyu/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 16:57:54 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 16:57:54 GMT</pubDate><ttl>60</ttl><item><title>Debug Error! DAMAGE：after Normal block (#xxxx) 问题</title><link>http://www.cppblog.com/lingsuiyu/archive/2008/08/21/59510.html</link><dc:creator>零碎雨</dc:creator><author>零碎雨</author><pubDate>Thu, 21 Aug 2008 03:10:00 GMT</pubDate><guid>http://www.cppblog.com/lingsuiyu/archive/2008/08/21/59510.html</guid><wfw:comment>http://www.cppblog.com/lingsuiyu/comments/59510.html</wfw:comment><comments>http://www.cppblog.com/lingsuiyu/archive/2008/08/21/59510.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/lingsuiyu/comments/commentRss/59510.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lingsuiyu/services/trackbacks/59510.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 昨天在调程序时，发现了一个问题，在Debug模式下出现Debug Error！DAMAGE：after Normal block (#xxxx)错误，Release没问题。网上一搜，知道这是由越界访问内存，破坏了内存中其他数据而引起问题。但大部分帖子介绍这个问题都是由动态申请内存和动态释放引起。而我的程序中根本没有用过new和delete；也有一个帖子说数组越界也会发生这种情况，我又查了很多遍，数组都正常。只好继续调代码，最后被我跟到一个调用的DLL（DLL也是自己写的）里面，并且锁定在一行代码上：<br><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">ModelName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;strcat(ModelName,"</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">txt</span><span style="COLOR: #000000">");&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;ModelName的类型是char&nbsp;*</span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里ModelName是从调用DLL的类的实例中传过来的一个字符串指针，在DLL中由于上面的语句，导致调用处的字符指针越界，从而产生了这个错误。因为Release没有内存越界提示，所以没有发现这个问题，但这样的内存隐患足以致命。可见操作指针内存小心为上，故慎重的把它记录下来。 
<img src ="http://www.cppblog.com/lingsuiyu/aggbug/59510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lingsuiyu/" target="_blank">零碎雨</a> 2008-08-21 11:10 <a href="http://www.cppblog.com/lingsuiyu/archive/2008/08/21/59510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于c++继承带来的开销的疑惑</title><link>http://www.cppblog.com/lingsuiyu/archive/2008/08/21/59499.html</link><dc:creator>零碎雨</dc:creator><author>零碎雨</author><pubDate>Thu, 21 Aug 2008 02:09:00 GMT</pubDate><guid>http://www.cppblog.com/lingsuiyu/archive/2008/08/21/59499.html</guid><wfw:comment>http://www.cppblog.com/lingsuiyu/comments/59499.html</wfw:comment><comments>http://www.cppblog.com/lingsuiyu/archive/2008/08/21/59499.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/lingsuiyu/comments/commentRss/59499.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lingsuiyu/services/trackbacks/59499.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Efficient C++的第二章，讲述了关于继承和构造(析构)函数造成的计算开销，仍然有些糊涂。对与以下三段关于互斥锁使用的代码（来自Efficient c++）：</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">&nbsp;Version&nbsp;1</span><span style="COLOR: #008000"><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;main()<br><img id=Codehighlighter1_24_230_Open_Image onclick="this.style.display='none'; Codehighlighter1_24_230_Open_Text.style.display='none'; Codehighlighter1_24_230_Closed_Image.style.display='inline'; Codehighlighter1_24_230_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_24_230_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_24_230_Closed_Text.style.display='none'; Codehighlighter1_24_230_Open_Image.style.display='inline'; Codehighlighter1_24_230_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_24_230_Open_Text><span style="COLOR: #000000">{<span id=Codehighlighter1_24_230_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"></span><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Start&nbsp;timing&nbsp;here</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">1000000</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<span id=Codehighlighter1_92_196_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"></span><br><img id=Codehighlighter1_92_196_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_196_Open_Text.style.display='none'; Codehighlighter1_92_196_Closed_Image.style.display='inline'; Codehighlighter1_92_196_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_92_196_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_196_Closed_Text.style.display='none'; Codehighlighter1_92_196_Open_Image.style.display='inline'; Codehighlighter1_92_196_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_92_196_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">mutex);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shareCounter</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;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">mutex);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></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: #008000">//</span><span style="COLOR: #008000">&nbsp;Stop&nbsp;timing&nbsp;here</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p>&nbsp;</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">&nbsp;Version&nbsp;2</span><span style="COLOR: #008000"><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;main()<br><img id=Codehighlighter1_24_187_Open_Image onclick="this.style.display='none'; Codehighlighter1_24_187_Open_Text.style.display='none'; Codehighlighter1_24_187_Closed_Image.style.display='inline'; Codehighlighter1_24_187_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_24_187_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_24_187_Closed_Text.style.display='none'; Codehighlighter1_24_187_Open_Image.style.display='inline'; Codehighlighter1_24_187_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_24_187_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_24_187_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Start&nbsp;timing&nbsp;here</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">1000000</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_92_153_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_153_Open_Text.style.display='none'; Codehighlighter1_92_153_Closed_Image.style.display='inline'; Codehighlighter1_92_153_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_92_153_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_153_Closed_Text.style.display='none'; Codehighlighter1_92_153_Open_Image.style.display='inline'; Codehighlighter1_92_153_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_92_153_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_92_153_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleMutex&nbsp;m(mutex);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sharedCounter</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></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: #008000">//</span><span style="COLOR: #008000">&nbsp;Stop&nbsp;timing&nbsp;here</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><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;SimpleMutex<br><img id=Codehighlighter1_208_464_Open_Image onclick="this.style.display='none'; Codehighlighter1_208_464_Open_Text.style.display='none'; Codehighlighter1_208_464_Closed_Image.style.display='inline'; Codehighlighter1_208_464_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_208_464_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_208_464_Closed_Text.style.display='none'; Codehighlighter1_208_464_Open_Image.style.display='inline'; Codehighlighter1_208_464_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_208_464_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_208_464_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_270_281_Open_Image onclick="this.style.display='none'; Codehighlighter1_270_281_Open_Text.style.display='none'; Codehighlighter1_270_281_Closed_Image.style.display='inline'; Codehighlighter1_270_281_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_270_281_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_270_281_Closed_Text.style.display='none'; Codehighlighter1_270_281_Open_Image.style.display='inline'; Codehighlighter1_270_281_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;SimpleMutex(pthread_mutex_t&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">lock</span><span style="COLOR: #000000">):myLock(</span><span style="COLOR: #0000ff">lock</span><span style="COLOR: #000000">)</span><span id=Codehighlighter1_270_281_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_270_281_Open_Text><span style="COLOR: #000000">{acquire();}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_299_310_Open_Image onclick="this.style.display='none'; Codehighlighter1_299_310_Open_Text.style.display='none'; Codehighlighter1_299_310_Closed_Image.style.display='inline'; Codehighlighter1_299_310_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_299_310_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_299_310_Closed_Text.style.display='none'; Codehighlighter1_299_310_Open_Image.style.display='inline'; Codehighlighter1_299_310_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">SimpleMutex</span><span id=Codehighlighter1_299_310_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_299_310_Open_Text><span style="COLOR: #000000">{release();}</span></span><span style="COLOR: #000000"><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></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_339_375_Open_Image onclick="this.style.display='none'; Codehighlighter1_339_375_Open_Text.style.display='none'; Codehighlighter1_339_375_Closed_Image.style.display='inline'; Codehighlighter1_339_375_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_339_375_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_339_375_Closed_Text.style.display='none'; Codehighlighter1_339_375_Open_Image.style.display='inline'; Codehighlighter1_339_375_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;acquire()</span><span id=Codehighlighter1_339_375_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_339_375_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;pthread_mutex_lock(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">myLock);}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_394_432_Open_Image onclick="this.style.display='none'; Codehighlighter1_394_432_Open_Text.style.display='none'; Codehighlighter1_394_432_Closed_Image.style.display='inline'; Codehighlighter1_394_432_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_394_432_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_394_432_Closed_Text.style.display='none'; Codehighlighter1_394_432_Open_Image.style.display='inline'; Codehighlighter1_394_432_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;release()</span><span id=Codehighlighter1_394_432_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_394_432_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;pthread_mutex_unlock(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">myLock);}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_t&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;myLock;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;</span></div>
<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: #008000">//</span><span style="COLOR: #008000">&nbsp;Version&nbsp;3</span><span style="COLOR: #008000"><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;main()<br><img id=Codehighlighter1_24_188_Open_Image onclick="this.style.display='none'; Codehighlighter1_24_188_Open_Text.style.display='none'; Codehighlighter1_24_188_Closed_Image.style.display='inline'; Codehighlighter1_24_188_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_24_188_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_24_188_Closed_Text.style.display='none'; Codehighlighter1_24_188_Open_Image.style.display='inline'; Codehighlighter1_24_188_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_24_188_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_24_188_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Start&nbsp;timing&nbsp;here</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">1000000</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_92_154_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_154_Open_Text.style.display='none'; Codehighlighter1_92_154_Closed_Image.style.display='inline'; Codehighlighter1_92_154_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_92_154_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_154_Closed_Text.style.display='none'; Codehighlighter1_92_154_Open_Image.style.display='inline'; Codehighlighter1_92_154_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_92_154_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_92_154_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DerivedMutex&nbsp;m(mutex);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sharedCounter</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></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: #008000">//</span><span style="COLOR: #008000">&nbsp;Stop&nbsp;timing&nbsp;here</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><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;BaseMutex<br><img id=Codehighlighter1_207_286_Open_Image onclick="this.style.display='none'; Codehighlighter1_207_286_Open_Text.style.display='none'; Codehighlighter1_207_286_Closed_Image.style.display='inline'; Codehighlighter1_207_286_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_207_286_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_207_286_Closed_Text.style.display='none'; Codehighlighter1_207_286_Open_Image.style.display='inline'; Codehighlighter1_207_286_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_207_286_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_207_286_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_254_255_Open_Image onclick="this.style.display='none'; Codehighlighter1_254_255_Open_Text.style.display='none'; Codehighlighter1_254_255_Closed_Image.style.display='inline'; Codehighlighter1_254_255_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_254_255_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_254_255_Closed_Text.style.display='none'; Codehighlighter1_254_255_Open_Image.style.display='inline'; Codehighlighter1_254_255_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;BaseMutex(pthread_mutex_t&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">lock</span><span style="COLOR: #000000">)</span><span id=Codehighlighter1_254_255_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_254_255_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_282_283_Open_Image onclick="this.style.display='none'; Codehighlighter1_282_283_Open_Text.style.display='none'; Codehighlighter1_282_283_Closed_Image.style.display='inline'; Codehighlighter1_282_283_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_282_283_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_282_283_Closed_Text.style.display='none'; Codehighlighter1_282_283_Open_Image.style.display='inline'; Codehighlighter1_282_283_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Virtual&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">BaseMutex()</span><span id=Codehighlighter1_282_283_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_282_283_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></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;DerivedMutex:</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;BaseMutex<br><img id=Codehighlighter1_326_601_Open_Image onclick="this.style.display='none'; Codehighlighter1_326_601_Open_Text.style.display='none'; Codehighlighter1_326_601_Closed_Image.style.display='inline'; Codehighlighter1_326_601_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_326_601_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_326_601_Closed_Text.style.display='none'; Codehighlighter1_326_601_Open_Image.style.display='inline'; Codehighlighter1_326_601_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_326_601_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_326_601_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_404_415_Open_Image onclick="this.style.display='none'; Codehighlighter1_404_415_Open_Text.style.display='none'; Codehighlighter1_404_415_Closed_Image.style.display='inline'; Codehighlighter1_404_415_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_404_415_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_404_415_Closed_Text.style.display='none'; Codehighlighter1_404_415_Open_Image.style.display='inline'; Codehighlighter1_404_415_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DerivedMutex(pthread_mutex_t&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #0000ff">lock</span><span style="COLOR: #000000">):BaseMutex(</span><span style="COLOR: #0000ff">lock</span><span style="COLOR: #000000">),myLock(</span><span style="COLOR: #0000ff">lock</span><span style="COLOR: #000000">)</span><span id=Codehighlighter1_404_415_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_404_415_Open_Text><span style="COLOR: #000000">{acquire();}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_436_447_Open_Image onclick="this.style.display='none'; Codehighlighter1_436_447_Open_Text.style.display='none'; Codehighlighter1_436_447_Closed_Image.style.display='inline'; Codehighlighter1_436_447_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_436_447_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_436_447_Closed_Text.style.display='none'; Codehighlighter1_436_447_Open_Image.style.display='inline'; Codehighlighter1_436_447_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">DerivedMutex()</span><span id=Codehighlighter1_436_447_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_436_447_Open_Text><span style="COLOR: #000000">{release();}</span></span><span style="COLOR: #000000"><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></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_476_512_Open_Image onclick="this.style.display='none'; Codehighlighter1_476_512_Open_Text.style.display='none'; Codehighlighter1_476_512_Closed_Image.style.display='inline'; Codehighlighter1_476_512_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_476_512_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_476_512_Closed_Text.style.display='none'; Codehighlighter1_476_512_Open_Image.style.display='inline'; Codehighlighter1_476_512_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;acquire()</span><span id=Codehighlighter1_476_512_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_476_512_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;pthread_mutex_lock(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">myLock);}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_531_569_Open_Image onclick="this.style.display='none'; Codehighlighter1_531_569_Open_Text.style.display='none'; Codehighlighter1_531_569_Closed_Image.style.display='inline'; Codehighlighter1_531_569_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_531_569_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_531_569_Closed_Text.style.display='none'; Codehighlighter1_531_569_Open_Image.style.display='inline'; Codehighlighter1_531_569_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;release()</span><span id=Codehighlighter1_531_569_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_531_569_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;pthread_mutex_unlock(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">myLock);}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_t&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;myLock;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;</span></div>
<br>书中测得的结果是Version 1和 Version 2 耗时相同，为1.01s，而Version 3 耗时1.63秒，这说明前两个版本计算开销相同而第三个版本计算开销明显增加。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而书中也说了Version 2 的构造函数中，初始化myLock成员是计算损失，当acquire()内联不成功的时候，调用acquire()也是计算损失。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再看Version 3，它首先调用基类的构造函数，由于是内联的，而且函数体为空，其开销应该忽略不计，然后是初始化myLock，调用acquire()，这些都跟Version 2中一样。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样看起来反倒是Version 2 和&nbsp; Version 3 的计算花费应该相同了，而Version 1的计算花费要比它们少。而书上好像没有对这个问题作出解释。我不知道是什么地方理解错误了，所以先悬着，等找到答案再把它写完。或者如有看到此文而不吝赐教的，不胜感激！
<img src ="http://www.cppblog.com/lingsuiyu/aggbug/59499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lingsuiyu/" target="_blank">零碎雨</a> 2008-08-21 10:09 <a href="http://www.cppblog.com/lingsuiyu/archive/2008/08/21/59499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>