﻿<?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++博客-编程自动化-文章分类-转载经典文章</title><link>http://www.cppblog.com/AutomateProgram/category/8844.html</link><description>生活不该只有代码</description><language>zh-cn</language><lastBuildDate>Mon, 02 Mar 2009 21:37:20 GMT</lastBuildDate><pubDate>Mon, 02 Mar 2009 21:37:20 GMT</pubDate><ttl>60</ttl><item><title>计算C++程序运行时间(备忘)</title><link>http://www.cppblog.com/AutomateProgram/articles/74981.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 26 Feb 2009 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/articles/74981.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/74981.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/articles/74981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/74981.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/74981.html</trackback:ping><description><![CDATA[<h1><sup></sup>MSDN clock</h1>
<p>经常忘记写一下：</p>
<p class=label><strong>Example </strong></p>
<pre><code>/* CLOCK.C: This example prompts for how long
* the program is to run and then continuously
* displays the elapsed time for that period.
*/
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;
void sleep( clock_t wait );
void main( void )
{
&nbsp; long&nbsp;&nbsp;&nbsp; i = 600000L;
&nbsp; clock_t start, finish;
&nbsp; double&nbsp; duration;
&nbsp; /* Delay for a specified time. */
&nbsp; printf( "Delay for three seconds\n" );
&nbsp; sleep( (clock_t)3 * CLOCKS_PER_SEC );
&nbsp; printf( "Done!\n" );
&nbsp; /* Measure the duration of an event. */
&nbsp; printf( "Time to do %ld empty loops is ", i );
&nbsp; start = clock();
&nbsp; while( i-- )
&nbsp;&nbsp;&nbsp;&nbsp; ;
&nbsp; finish = clock();
&nbsp; duration = (double)(finish - start) / CLOCKS_PER_SEC;
&nbsp; printf( "%2.1f seconds\n", duration );
}
/* Pauses for a specified number of milliseconds. */
void sleep( clock_t wait )
{
&nbsp; clock_t goal;
&nbsp; goal = wait + clock();
&nbsp; while( goal &gt; clock() )
&nbsp;&nbsp;&nbsp;&nbsp; ;
}
</code></pre>
<p class=label><strong>Output</strong></p>
<pre><code>Delay for three seconds
Done!
Time to do 600000 empty loops is 0.1 seconds
</code></pre>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/74981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2009-02-26 15:31 <a href="http://www.cppblog.com/AutomateProgram/articles/74981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>智能指针std::auto_ptr的用法(转)</title><link>http://www.cppblog.com/AutomateProgram/articles/66980.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sat, 15 Nov 2008 03:19:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/articles/66980.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/66980.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/articles/66980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/66980.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/66980.html</trackback:ping><description><![CDATA[原文地址：<a href="http://www.oolec.com/smart_pointer_auto_ptr_usage/">http://www.oolec.com/smart_pointer_auto_ptr_usage/</a><br><br><br>
<p class=article-text>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;在c++程序中，内存管理中经常隐藏着很深的bug。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虽然我们一般可以采用vector,string,map等容器自动管理内存，<br>但涉及多态，继承的时候也不可避免的要手动管理，c++标准库中提供的<a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><u><font color=#0000ff>auto_ptr</font></u></a>能一定程度上帮助我们。<br><br><a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><u><span style="COLOR: red">auto_ptr</span></u></a><span style="COLOR: red">用法：</span><br>1.需要包含头文件<br><memory><br>2.Constructor：explicit <a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><u><font color=#0000ff>auto_ptr</font></u></a>(X* p = 0) throw();<br>将指针p交给<a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><u><font color=#0000ff>auto_ptr</font></u></a>对象托管<br><br>3.Copy constructor:<br><a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><u><font color=#0000ff>auto_ptr</font></u></a>(const <a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><u><font color=#0000ff>auto_ptr</font></u></a>&amp;) throw();<br>template<class Y> <a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><u><font color=#0000ff>auto_ptr</font></u></a>(const <a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><u><font color=#0000ff>auto_ptr</font></u></a><y>&amp; a) throw();<br>指针的托管权会发生转移<br><br>4.Destructor: ~<a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><u><font color=#0000ff>auto_ptr</font></u></a>();<br>释放指针p指向的空间<br><br>5.提供了两个成员函数<br>X* get() const throw();//返回保存的指针，对象中仍保留指针<br>X* release() const throw();//返回保存的指针，对象中不保留指针</p>
<p><a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><u><span style="COLOR: red">auto_ptr</span></u></a><span style="COLOR: red">实现关键点<br></span>1.利用特点&#8221;栈上对象在离开作用范围时会自动析构&#8221;<br>2.对于动态分配的内存，其作用范围是程序员手动控制的，这给程序员带来了方便但也不可避免疏忽造成的内存泄漏，毕竟只有编译器是最可靠的。<br>3.<a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><u><font color=#0000ff>auto_ptr</font></u></a>通过在栈上构建一个对象a，对象a中wrap了动态分配内存的指针p，所有对指针p的操作都转为对对象a的操作。而在a的析构函数中会自动释放p的空间，而该析构函数是编译器自动调用的，无需程序员操心。</p>
<p>多说无益，看一个最实用的例子：</p>
<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">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</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">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></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<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;TC<br><img id=Codehighlighter1_68_144_Open_Image onclick="this.style.display='none'; Codehighlighter1_68_144_Open_Text.style.display='none'; Codehighlighter1_68_144_Closed_Image.style.display='inline'; Codehighlighter1_68_144_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_68_144_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_68_144_Closed_Text.style.display='none'; Codehighlighter1_68_144_Open_Image.style.display='inline'; Codehighlighter1_68_144_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_68_144_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_68_144_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_86_108_Open_Image onclick="this.style.display='none'; Codehighlighter1_86_108_Open_Text.style.display='none'; Codehighlighter1_86_108_Closed_Image.style.display='inline'; Codehighlighter1_86_108_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_86_108_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_86_108_Closed_Text.style.display='none'; Codehighlighter1_86_108_Open_Image.style.display='inline'; Codehighlighter1_86_108_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;TC()</span><span id=Codehighlighter1_86_108_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_86_108_Open_Text><span style="COLOR: #000000">{&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">TC()</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_119_142_Open_Image onclick="this.style.display='none'; Codehighlighter1_119_142_Open_Text.style.display='none'; Codehighlighter1_119_142_Closed_Image.style.display='inline'; Codehighlighter1_119_142_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_119_142_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_119_142_Closed_Text.style.display='none'; Codehighlighter1_119_142_Open_Image.style.display='inline'; Codehighlighter1_119_142_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">TC()</span><span id=Codehighlighter1_119_142_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_119_142_Open_Text><span style="COLOR: #000000">{&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">~~TC()</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;}</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></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;foo(</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;isThrow)<br><img id=Codehighlighter1_170_438_Open_Image onclick="this.style.display='none'; Codehighlighter1_170_438_Open_Text.style.display='none'; Codehighlighter1_170_438_Closed_Image.style.display='inline'; Codehighlighter1_170_438_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_170_438_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_170_438_Closed_Text.style.display='none'; Codehighlighter1_170_438_Open_Image.style.display='inline'; Codehighlighter1_170_438_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_170_438_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_170_438_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;auto_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">TC</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;pTC(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;TC);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">方法2<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;TC&nbsp;*pTC=new&nbsp;TC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">方法1</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">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_270_323_Open_Image onclick="this.style.display='none'; Codehighlighter1_270_323_Open_Text.style.display='none'; Codehighlighter1_270_323_Closed_Image.style.display='inline'; Codehighlighter1_270_323_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_270_323_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_270_323_Closed_Text.style.display='none'; Codehighlighter1_270_323_Open_Image.style.display='inline'; Codehighlighter1_270_323_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_270_323_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_323_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;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(isThrow)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">haha</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: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;e)<br><img id=Codehighlighter1_355_408_Open_Image onclick="this.style.display='none'; Codehighlighter1_355_408_Open_Text.style.display='none'; Codehighlighter1_355_408_Closed_Image.style.display='inline'; Codehighlighter1_355_408_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_355_408_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_355_408_Closed_Text.style.display='none'; Codehighlighter1_355_408_Open_Image.style.display='inline'; Codehighlighter1_355_408_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_355_408_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_355_408_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pTC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">方法1</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">throw</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></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;delete&nbsp;pTC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">方法1</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"><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 src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_455_474_Open_Image onclick="this.style.display='none'; Codehighlighter1_455_474_Open_Text.style.display='none'; Codehighlighter1_455_474_Closed_Image.style.display='inline'; Codehighlighter1_455_474_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_455_474_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_455_474_Closed_Text.style.display='none'; Codehighlighter1_455_474_Open_Image.style.display='inline'; Codehighlighter1_455_474_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_455_474_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_455_474_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;foo(</span><span style="COLOR: #0000ff">true</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></span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(<img src="http://www.cppblog.com/Images/dot.gif">)<br><img id=Codehighlighter1_488_518_Open_Image onclick="this.style.display='none'; Codehighlighter1_488_518_Open_Text.style.display='none'; Codehighlighter1_488_518_Closed_Image.style.display='inline'; Codehighlighter1_488_518_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_488_518_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_488_518_Closed_Text.style.display='none'; Codehighlighter1_488_518_Open_Image.style.display='inline'; Codehighlighter1_488_518_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_488_518_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_488_518_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">caught</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p><span style="COLOR: red">分析：</span><br>1.如果采用方案1，那么必须考虑到函数在因throw异常的时候释放所分配的内存。<br>这样造成的结果是在每个分支处都要很小心的手动 delete pTC;<br>2.如果采用方案2，那就无需操心何时释放内存，不管foo()因何原因退出，<br>栈上对象pTC的析构函数都将调用，因此托管在之中的指针所指的内存必然安全释放。<br><br><span style="COLOR: red">注意：</span></p>
<p>至此，智能指针的优点已经很明了了。<br>但是要注意使用中的一个陷阱,那就是指针的托管权是会转移的。<br>例如在上例中，如果<br><a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><font color=#46a8c8>auto_ptr</font></a><tc> pTC(new TC);<br><a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><font color=#46a8c8>auto_ptr</font></a><tc> pTC1=pTC;<br>那么,pTC1将拥有该指针，而pTC没有了，如果再用pTC去引用，必然导致内存错误。<br>要避免这个问题，可以考虑使用采用了引用计数的智能指针，例如boost::shared_ptr等<br><br><br><span style="COLOR: red">个人观点<br><br>1.<br>vc++库中的智能指针auto_ptr本不像都像前面介绍的那样<br><a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><font color=#46a8c8>auto_ptr</font></a><tc><font color=#000000> pTC(new TC);<br></font><a class="st_tag internal_tag" title="标签 auto_ptr 下的日志" href="http://www.oolec.com/tag/auto_ptr/" rel=tag><font color=#46a8c8>auto_ptr</font></a><tc><font color=#000000> pTC1=pTC;</font><br>其中pTC指针并没有被托管，其地址还是指向new TC 的。但是并没有出现同一个指针释放两次的问题。<br><br>2.VC中的 auto_ptr是一个对象，和内置指针是不一样的，它没有支持测试智能指针NULL的功能。<br>auto_ptr&lt;TestC&gt; p;<br>if(p == NULL); 并没有办法通过编译。<br>3.并不支持将智能指针转化为内置指针，如：<br>void print(TestC* p)</span></p>
{<br>//...<br>}<br>auto_ptr&lt;TestC&gt; p(new TestC);<br>print(p);没有办法通过编译<br>解决的办法是重载operator T*();<br>4.内置指针在c++中一个重要的作用是用来实现多态，但是vc++智能指针并不支持.<br>实现的方法是<br>template&lt;class T&gt;<br>template &lt;class U&gt;<br>&nbsp;MyAuto_ptr(MyAuto_ptr&lt;U&gt;&amp; rhs);<br><br>可以参考：《More Effective c++ 》条款28 P158<br>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/66980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2008-11-15 11:19 <a href="http://www.cppblog.com/AutomateProgram/articles/66980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>