﻿<?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++博客-free2000fly 的自留地</title><link>http://www.cppblog.com/free2000fly/</link><description>关于 c/c++, asm 等的 trashs </description><language>zh-cn</language><lastBuildDate>Sun, 05 Apr 2026 17:10:16 GMT</lastBuildDate><pubDate>Sun, 05 Apr 2026 17:10:16 GMT</pubDate><ttl>60</ttl><item><title>輕量級基於引用計數的智能指針類</title><link>http://www.cppblog.com/free2000fly/archive/2013/06/15/201029.html</link><dc:creator>free2000fly</dc:creator><author>free2000fly</author><pubDate>Sat, 15 Jun 2013 05:18:00 GMT</pubDate><guid>http://www.cppblog.com/free2000fly/archive/2013/06/15/201029.html</guid><wfw:comment>http://www.cppblog.com/free2000fly/comments/201029.html</wfw:comment><comments>http://www.cppblog.com/free2000fly/archive/2013/06/15/201029.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/free2000fly/comments/commentRss/201029.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/free2000fly/services/trackbacks/201029.html</trackback:ping><description><![CDATA[<p><em>Ralph Shane</em> (free2000fly at gmail dot com)</p>
<p><a href="https://github.com/free2000fly/SmartPointer">Smart Pointer</a><br /><br /><span style="font-size: 18pt"></span><font size="5">概述</font><br /><br />包含兩种指針: 強指針 strong_ptr&nbsp;和 弱指針 weak_ptr。基本上可以替換 std::shared_ptr 和 std::weak_ptr.<br /></p>
<p>強指針對象持有物件的指針並增加&#8220;強&#8221;引用計數；當強指針對象析搆時，&#8220;強&#8221;引用計數自減；當&#8220;強&#8221;引用計數自減到 0 時，強指針對象釋放物件實體。</p>
<p>弱指針對象不負責管理所持有物件的生命周期，它僅僅維護著一個&#8220;弱&#8221;引用計數，並在需要時從自身生成一個強指針。弱指針的存在是爲了避免循環引用情況的出現，從而導致智能指針持有的物件無法釋放。</p>
<h1><span style="font-size: 18pt">實現細節</span></h1>
<ol><li>
<p>簡單的類 <code>ref_count</code> 用於實現對&#8220;強&#8221;引用計數和&#8220;弱&#8221;引用計數的操作。</p></li><li>
<p>基類 <code>base_ptr</code> 實現了強指針和弱指針的絕大部分邏輯，這個類是強指針和弱指針共同的基類。有兩個成員變量，<code>ref_count</code> 對象實體指針 <code>m_counter</code> 和 raw 物件指針。這個類的關鍵點有四: </p>
<p>(1) 在非零的 raw 物件指針傳入到構造函數時，持有該指針，並創建 <code>ref_count</code> 對象實體指針 <code>m_counter</code> 成員變量，此時&#8220;強&#8221;引用計數為 1，而&#8220;弱&#8221;引用計數為 0。</p>
<p>(2) 在&#8220;拷貝構造函數&#8221;的參數裏傳入強指針或弱指針對象時，調用 <code>acquire</code> 函數。</p>
<p>(3) <code>acquire</code> 函數裏完成兩件事: 持有傳入的 <code>ref_count</code> 對象指針，增加&#8220;強&#8221;引用計數或&#8220;弱&#8221;引用計數；持有傳入的 raw 物件指針。</p>
<p>(4) 在 <code>base_ptr</code> 對象析搆時，調用最關鍵的 <code>release</code> 函數。<code>release</code> 函數針對自身 <code>base_ptr</code> 對象是強指針還是弱指針決定&#8220;強&#8221;引用計數或&#8220;弱&#8221;引用計數的自減。當&#8220;強&#8221;引用計數為 0 時，釋放（delete）持有的物件。繼續下一步的判斷，當&#8220;強&#8221;引用計數和&#8220;弱&#8221;引用計數都為 0 時，釋放（delete）<code>ref_count</code> 對象實體指針 <code>m_counter</code>。然後將 raw 物件指針 <code>m_ptr</code> 和 <code>m_counter</code> 變量歸零。</p></li><li>
<p><code>strong_ptr</code> 類基本上就是轉發 <code>base_ptr</code> 基類的操作。<code>weak_ptr</code> 類與 <code>strong_ptr</code> 類似，就是將對 raw 物件指針的直接操作屏蔽掉。</p></li></ol>
<p>源代碼的下載地址： <font color="#000000" face="Verdana"><a href="https://github.com/free2000fly/SmartPointer/blob/master/smart_ptr.h">https://github.com/free2000fly/SmartPointer/blob/master/smart_ptr.h</a></font> <br />&nbsp;</p><img src ="http://www.cppblog.com/free2000fly/aggbug/201029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/free2000fly/" target="_blank">free2000fly</a> 2013-06-15 13:18 <a href="http://www.cppblog.com/free2000fly/archive/2013/06/15/201029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>扩展内核函数 PsSetCreateProcessNotifyRoutine 等的蹲坑数量</title><link>http://www.cppblog.com/free2000fly/archive/2011/01/22/139109.html</link><dc:creator>free2000fly</dc:creator><author>free2000fly</author><pubDate>Sat, 22 Jan 2011 04:38:00 GMT</pubDate><guid>http://www.cppblog.com/free2000fly/archive/2011/01/22/139109.html</guid><wfw:comment>http://www.cppblog.com/free2000fly/comments/139109.html</wfw:comment><comments>http://www.cppblog.com/free2000fly/archive/2011/01/22/139109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/free2000fly/comments/commentRss/139109.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/free2000fly/services/trackbacks/139109.html</trackback:ping><description><![CDATA[<a href="http://blog.tinybrowser.net/archives/2534">http://blog.tinybrowser.net/archives/2534</a><img src ="http://www.cppblog.com/free2000fly/aggbug/139109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/free2000fly/" target="_blank">free2000fly</a> 2011-01-22 12:38 <a href="http://www.cppblog.com/free2000fly/archive/2011/01/22/139109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在 VS 2008 内开发驱动程序的 "解决方案" 的编译链接选项</title><link>http://www.cppblog.com/free2000fly/archive/2010/02/28/108631.html</link><dc:creator>free2000fly</dc:creator><author>free2000fly</author><pubDate>Sun, 28 Feb 2010 12:53:00 GMT</pubDate><guid>http://www.cppblog.com/free2000fly/archive/2010/02/28/108631.html</guid><wfw:comment>http://www.cppblog.com/free2000fly/comments/108631.html</wfw:comment><comments>http://www.cppblog.com/free2000fly/archive/2010/02/28/108631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/free2000fly/comments/commentRss/108631.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/free2000fly/services/trackbacks/108631.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/free2000fly/archive/2010/02/28/108631.html'>阅读全文</a><img src ="http://www.cppblog.com/free2000fly/aggbug/108631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/free2000fly/" target="_blank">free2000fly</a> 2010-02-28 20:53 <a href="http://www.cppblog.com/free2000fly/archive/2010/02/28/108631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建有导出函数的内核驱动程序</title><link>http://www.cppblog.com/free2000fly/archive/2010/02/27/108527.html</link><dc:creator>free2000fly</dc:creator><author>free2000fly</author><pubDate>Sat, 27 Feb 2010 02:22:00 GMT</pubDate><guid>http://www.cppblog.com/free2000fly/archive/2010/02/27/108527.html</guid><wfw:comment>http://www.cppblog.com/free2000fly/comments/108527.html</wfw:comment><comments>http://www.cppblog.com/free2000fly/archive/2010/02/27/108527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/free2000fly/comments/commentRss/108527.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/free2000fly/services/trackbacks/108527.html</trackback:ping><description><![CDATA[<a title="http://blog.tinybrowser.net/archives/1371" href="http://blog.tinybrowser.net/archives/1371">http://blog.tinybrowser.net/archives/1371</a><br><br>  <img src ="http://www.cppblog.com/free2000fly/aggbug/108527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/free2000fly/" target="_blank">free2000fly</a> 2010-02-27 10:22 <a href="http://www.cppblog.com/free2000fly/archive/2010/02/27/108527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终于将迅雷赶出了我的电脑</title><link>http://www.cppblog.com/free2000fly/archive/2010/02/21/108129.html</link><dc:creator>free2000fly</dc:creator><author>free2000fly</author><pubDate>Sun, 21 Feb 2010 03:05:00 GMT</pubDate><guid>http://www.cppblog.com/free2000fly/archive/2010/02/21/108129.html</guid><wfw:comment>http://www.cppblog.com/free2000fly/comments/108129.html</wfw:comment><comments>http://www.cppblog.com/free2000fly/archive/2010/02/21/108129.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/free2000fly/comments/commentRss/108129.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/free2000fly/services/trackbacks/108129.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 同时好几十个连接在操作系统里. 将网络带宽占光耗尽, 造成拥堵.别的软件的互联网连接基本上就不可能进行了. 因此, 只要你开着迅雷, 用浏览器浏览网页那是奇慢无比, 甚至同一局域网内的电脑也受影响, 慢如蜗牛.&nbsp;&nbsp;<a href='http://www.cppblog.com/free2000fly/archive/2010/02/21/108129.html'>阅读全文</a><img src ="http://www.cppblog.com/free2000fly/aggbug/108129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/free2000fly/" target="_blank">free2000fly</a> 2010-02-21 11:05 <a href="http://www.cppblog.com/free2000fly/archive/2010/02/21/108129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手工加载未注册的 COM 组件</title><link>http://www.cppblog.com/free2000fly/archive/2010/02/15/107906.html</link><dc:creator>free2000fly</dc:creator><author>free2000fly</author><pubDate>Mon, 15 Feb 2010 13:25:00 GMT</pubDate><guid>http://www.cppblog.com/free2000fly/archive/2010/02/15/107906.html</guid><wfw:comment>http://www.cppblog.com/free2000fly/comments/107906.html</wfw:comment><comments>http://www.cppblog.com/free2000fly/archive/2010/02/15/107906.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/free2000fly/comments/commentRss/107906.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/free2000fly/services/trackbacks/107906.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 用这种途径创建组件实例的主要思路就是, 调用组件 DLL 导出的 DllGetClassObject 函数, 创建类厂 IClassFactory 的实例, 然后用 IClassFactory::CreateInstance 函数创建目标接口指针的实例.<br><br>&nbsp;&nbsp;<a href='http://www.cppblog.com/free2000fly/archive/2010/02/15/107906.html'>阅读全文</a><img src ="http://www.cppblog.com/free2000fly/aggbug/107906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/free2000fly/" target="_blank">free2000fly</a> 2010-02-15 21:25 <a href="http://www.cppblog.com/free2000fly/archive/2010/02/15/107906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CString 的性能之殇</title><link>http://www.cppblog.com/free2000fly/archive/2010/02/01/106930.html</link><dc:creator>free2000fly</dc:creator><author>free2000fly</author><pubDate>Mon, 01 Feb 2010 03:18:00 GMT</pubDate><guid>http://www.cppblog.com/free2000fly/archive/2010/02/01/106930.html</guid><wfw:comment>http://www.cppblog.com/free2000fly/comments/106930.html</wfw:comment><comments>http://www.cppblog.com/free2000fly/archive/2010/02/01/106930.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/free2000fly/comments/commentRss/106930.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/free2000fly/services/trackbacks/106930.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/free2000fly/archive/2010/02/01/106930.html'>阅读全文</a><img src ="http://www.cppblog.com/free2000fly/aggbug/106930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/free2000fly/" target="_blank">free2000fly</a> 2010-02-01 11:18 <a href="http://www.cppblog.com/free2000fly/archive/2010/02/01/106930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>本博自开发的小工具链接汇总</title><link>http://www.cppblog.com/free2000fly/archive/2009/12/21/103607.html</link><dc:creator>free2000fly</dc:creator><author>free2000fly</author><pubDate>Mon, 21 Dec 2009 00:43:00 GMT</pubDate><guid>http://www.cppblog.com/free2000fly/archive/2009/12/21/103607.html</guid><wfw:comment>http://www.cppblog.com/free2000fly/comments/103607.html</wfw:comment><comments>http://www.cppblog.com/free2000fly/archive/2009/12/21/103607.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/free2000fly/comments/commentRss/103607.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/free2000fly/services/trackbacks/103607.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/free2000fly/archive/2009/12/21/103607.html'>阅读全文</a><img src ="http://www.cppblog.com/free2000fly/aggbug/103607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/free2000fly/" target="_blank">free2000fly</a> 2009-12-21 08:43 <a href="http://www.cppblog.com/free2000fly/archive/2009/12/21/103607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用于 VS 2008 的 WTL splitter App 的 wizard 安装包</title><link>http://www.cppblog.com/free2000fly/archive/2009/12/21/103606.html</link><dc:creator>free2000fly</dc:creator><author>free2000fly</author><pubDate>Sun, 20 Dec 2009 22:42:00 GMT</pubDate><guid>http://www.cppblog.com/free2000fly/archive/2009/12/21/103606.html</guid><wfw:comment>http://www.cppblog.com/free2000fly/comments/103606.html</wfw:comment><comments>http://www.cppblog.com/free2000fly/archive/2009/12/21/103606.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/free2000fly/comments/commentRss/103606.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/free2000fly/services/trackbacks/103606.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/free2000fly/archive/2009/12/21/103606.html'>阅读全文</a><img src ="http://www.cppblog.com/free2000fly/aggbug/103606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/free2000fly/" target="_blank">free2000fly</a> 2009-12-21 06:42 <a href="http://www.cppblog.com/free2000fly/archive/2009/12/21/103606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文本比较算法(转帖)</title><link>http://www.cppblog.com/free2000fly/archive/2009/09/27/97339.html</link><dc:creator>free2000fly</dc:creator><author>free2000fly</author><pubDate>Sun, 27 Sep 2009 02:46:00 GMT</pubDate><guid>http://www.cppblog.com/free2000fly/archive/2009/09/27/97339.html</guid><wfw:comment>http://www.cppblog.com/free2000fly/comments/97339.html</wfw:comment><comments>http://www.cppblog.com/free2000fly/archive/2009/09/27/97339.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/free2000fly/comments/commentRss/97339.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/free2000fly/services/trackbacks/97339.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/free2000fly/archive/2009/09/27/97339.html'>阅读全文</a><img src ="http://www.cppblog.com/free2000fly/aggbug/97339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/free2000fly/" target="_blank">free2000fly</a> 2009-09-27 10:46 <a href="http://www.cppblog.com/free2000fly/archive/2009/09/27/97339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>