⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9_2_2 用户层垃圾回收算法的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.htm

📁 主要介绍了多任务下面的一些数据结构和算法,比如树和图的一些遍历
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<SCRIPT type=text/javascript>
_uacct = "UA-178341-4";
urchinTracker();
</SCRIPT>
<!-- /公共页头 --><LINK 
href="C:\Documents and Settings\K&amp;G\桌面\9_2_2 用户层垃圾回收算法的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files\style(1).css" 
type=text/css rel=stylesheet>
<DIV id=booknav2>
<DIV id=booknavtop>
<UL>
  <LI><A href="http://book.csdn.net/">首页</A> </LI>
  <LI><A href="http://book.csdn.net/book/morelz.aspx">精品连载</A> </LI>
  <LI><A href="http://club.book.csdn.net/people/myclub.aspx">我的书友会</A> </LI>
  <LI><A href="http://club.book.csdn.net/people/putblog.aspx">图书秀</A> </LI>
  <LI><A href="http://club.book.csdn.net/people/alllist.aspx">书架</A> </LI>
  <LI><A href="http://blog.csdn.net/group/bookread/" target=_blank>圈子</A> </LI>
  <LI><A href="http://down.csdn.net/app/list.php?tid=502" target=_blank>资源下载</A> 
  </LI>
  <LI><A href="http://bank.csdn.net/" target=_blank><FONT 
  style="FONT-WEIGHT: bold">银行</FONT></A> </LI></UL></DIV>
<SCRIPT type=text/javascript>
     function IsBlank(obj) //查看对象的值是否为空
    {
      if(obj.replace(/^\s+|\s+$/,"")=="")
		  {
		 
		    return true; 
		  }
		  else
		  {
		   return false;
		  }
		  
     }
    function SearchBook_Top()
    {
      if( !IsBlank(document.getElementById("txtTopKey").value))
      {
         var loc;
         var szType;
         if(document.getElementById("listSearchType").value==null)
          {    
            szType=  document.getElementById("listSearchType").options(document.getElementById("listSearchType").selectedIndex).value;  
          }
          else
          {
              szType= document.getElementById("listSearchType").value;
          }
          if(szType==1)
            loc="http://book.csdn.net/book/morelz.aspx?key="+escape(document.getElementById("txtTopKey").value);
          else
             loc="http://club.book.csdn.net/book/s.aspx?key="+escape(document.getElementById("txtTopKey").value);
          
          self.location=loc;
        
      } 
    }
  </SCRIPT>

<DIV id=booknavbottom2>
<DIV class=hotleft><A href="http://book.csdn.net/subject/allbook.htm" 
target=_blank>全部图书</A> <FONT color=red>推荐</FONT>:<A 
href="http://club.book.csdn.net/book/s.aspx?key=asp.net">ASP.NET</A> <A 
href="http://club.book.csdn.net/book/s.aspx?key=ajax">Ajax</A> <A 
href="http://club.book.csdn.net/book/s.aspx?key=spring">Spring</A> <A 
href="http://club.book.csdn.net/book/s.aspx?key=Hibernate">Hibernate</A> <A 
href="http://club.book.csdn.net/book/s.aspx?key=Java">Java</A></DIV>
<DIV class=hotright><SELECT id=listSearchType name=aa> <OPTION value=2 
  selected>书友会</OPTION> <OPTION value=1>连载</OPTION></SELECT><INPUT 
onkeypress=if(event.keyCode==13){SearchBook_Top();} id=txtTopKey maxLength=25><INPUT onclick=SearchBook_Top(); type=button value=搜索 name=提交></DIV></DIV></DIV>
<DIV class=area>
<SCRIPT 
src="9_2_2 用户层垃圾回收算法的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/BookDetailAd.js" 
type=text/javascript></SCRIPT>

<DIV class=col1>
<DIV class=lineBlue></DIV><!-- title -->
<DIV class=arcTitle>
<H1><A href="http://book.csdn.net/bookfiles/65">多任务下的数据结构与算法 </A></H1>
<DIV style="FONT-SIZE: 15px; TEXT-ALIGN: center"><A 
href="http://book.csdn.net/bookfiles/65/100652569.shtml">9.2.2 用户层垃圾回收算法的实现 
</A></DIV>
<DIV style="FONT-SIZE: 15px; TEXT-ALIGN: center"><A class=url 
href="http://book.csdn.net/">http://book.csdn.net/</A> 2006-8-14 14:19:00 </DIV>
<DIV class=clear></DIV>
<DIV 
style="BORDER-RIGHT: #0b5f98 1px solid; BORDER-TOP: #0b5f98 1px solid; MARGIN: 0px auto; BORDER-LEFT: #0b5f98 1px solid; WIDTH: 700px; BORDER-BOTTOM: #0b5f98 1px solid">
<DIV 
style="PADDING-RIGHT: 1px; PADDING-LEFT: 1px; FLOAT: left; PADDING-BOTTOM: 1px; WIDTH: 16px; COLOR: white; PADDING-TOP: 1px; BACKGROUND-COLOR: #0b5f98">图书导读 
</DIV>
<DIV 
style="PADDING-LEFT: 2px; FLOAT: right; WIDTH: 670px; LINE-HEIGHT: 16pt; TEXT-ALIGN: left"><!--导读-->
<H1 id=divCurrentNode 
style="PADDING-LEFT: 2px; FONT-SIZE: 12px; WIDTH: 100%; COLOR: #b83507; TEXT-ALIGN: left">当前章节:<A 
href="http://book.csdn.net/bookfiles/65/100652569.shtml"><FONT color=red>9.2.2 
用户层垃圾回收算法的实现</FONT></A></H1>
<DIV id=divRelateNode style="PADDING-LEFT: 2px">
<DIV style="FLOAT: left; WIDTH: 49%">·<A 
href="http://book.csdn.net/bookfiles/65/100652566.shtml">8.6.1 
线程池调度管理的基本概念</A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A 
href="http://book.csdn.net/bookfiles/65/100652567.shtml">8.6.2 
线程池调度管理的编码实现</A></DIV>
<DIV style="FLOAT: left; WIDTH: 49%">·<A 
href="http://book.csdn.net/bookfiles/65/100652568.shtml">9.2.1 
垃圾收集算法简介</A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A 
href="http://book.csdn.net/bookfiles/65/100652570.shtml">9.2.3 
多任务下的垃圾收集</A></DIV>
<DIV style="FLOAT: left; WIDTH: 49%">·<A 
href="http://book.csdn.net/bookfiles/65/100652571.shtml">9.2.4 
使用垃圾回收算法来做内存泄漏检查</A></DIV></DIV></DIV></DIV>
<DIV class=clear></DIV></DIV><!-- main -->
<DIV id=main>
<DIV id=text>
<DIV id=csdn_zhaig_ad_yahoo_2></DIV>
<H3 style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm"><A name=_Toc122884880></A><SPAN 
lang=EN-US>9.2.2</SPAN><SPAN lang=EN-US>&nbsp; </SPAN><SPAN 
style="FONT-FAMILY: 方正准圆简体">用户层垃圾回收算法的实现</SPAN></H3>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 华康简宋">由于很多垃圾回收算法都是在编译器层面实现的,而编译器层面实现起来牵涉的内容很复杂,一般软件人员理解起来很困难,实际上他们也没有必要去详细了解编译器层面的垃圾回收算法是如何实现的,为了讲清楚垃圾回收的原理,我们还是以一个用户程序层面的垃圾回收算法的具体实现来进行讲解。</SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 华康简宋">前面提到,引用计数算法简单易懂,且可以在用户程序层面实现,下面就以引用计数算法来实现一个</SPAN><SPAN 
lang=EN-US>C++</SPAN><SPAN style="FONT-FAMILY: 华康简宋">用户程序层面的垃圾回收算法。</SPAN></P>
<H4 style="MARGIN-LEFT: 0cm"><SPAN lang=EN-US>1. C++</SPAN><SPAN 
style="FONT-FAMILY: 黑体">用户程序层的垃圾回收实现原理</SPAN></H4>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 华康简宋">首先要了解清楚</SPAN><SPAN 
lang=EN-US>C++</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">用户程序层的垃圾回收实现原理,引用计数算法中,如何对一个已分配内存进行计数的增减操作呢?先看一段</SPAN><SPAN 
lang=EN-US>C++</SPAN><SPAN style="FONT-FAMILY: 华康简宋">的程序吧。</SPAN></P>
<P class=4><SPAN lang=EN-US>int *p</SPAN><SPAN 
style="FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">{</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *q = new 
int</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *q = 
100</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = new 
int</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *p = 
200</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 8pt; LINE-HEIGHT: 14pt"><SPAN 
lang=EN-US style="FONT-SIZE: 9pt">}</SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 华康简宋">在这段程序中,当执行“</SPAN><SPAN 
lang=EN-US>*q= 100</SPAN><SPAN style="FONT-FAMILY: 宋体">;</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">”语句时,需要对分配的内存引用计数加</SPAN><SPAN 
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 华康简宋">,当退出大括号“</SPAN><SPAN 
lang=EN-US>}</SPAN><SPAN style="FONT-FAMILY: 华康简宋">”后,由于指针变量</SPAN><SPAN 
lang=EN-US>q</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">已经被编译器释放掉了,所以这时指向的内存的引用计数要减</SPAN><SPAN 
lang=EN-US>1</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">。但在上面这段程序中,是没有实现引用计数功能的。要实现引用计数功能,就必须执行</SPAN><SPAN 
lang=EN-US>int *q = new int</SPAN><SPAN style="FONT-FAMILY: 宋体">;</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">这样的语句能自动给分配的内存增加引用计数,而指针变量</SPAN><SPAN 
lang=EN-US>q</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">释放时由于是编译器实现的,用户程序并不知道,所以还需要找到发现变量被编译器释放的方法。</SPAN></P>
<H4 style="MARGIN-LEFT: 0cm"><SPAN lang=EN-US>2. </SPAN><SPAN 
style="FONT-FAMILY: 黑体">模拟指针的</SPAN><SPAN lang=EN-US>C++</SPAN><SPAN 
style="FONT-FAMILY: 黑体">实现</SPAN></H4>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 华康简宋">如果可以设计一个类来模拟指针,那么就可以利用类的构造函数和析构函数来操作指针变量的引用计数,幸运的是</SPAN><SPAN 
lang=EN-US>C++</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">中的语法提供了这种功能,可以通过重载运算符“</SPAN><SPAN 
lang=EN-US>*</SPAN><SPAN style="FONT-FAMILY: 华康简宋">”、“,”、“</SPAN><SPAN 
lang=EN-US>=</SPAN><SPAN style="FONT-FAMILY: 华康简宋">”和“</SPAN><SPAN 
lang=EN-US>-&gt;</SPAN><SPAN style="FONT-FAMILY: 华康简宋">”来实现。</SPAN></P>
<P class=4><SPAN lang=EN-US>template &lt;class T&gt; class GCPtr {</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T 
*m_pAddr</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">public</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">:</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GCPtr(T 
*t=NULL){m_pAddr = t</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">}</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
~GCPtr()</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -