﻿<?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/Marcky/</link><description>My Email: marckywu@gmail.com</description><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 12:37:30 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 12:37:30 GMT</pubDate><ttl>60</ttl><item><title>二维数组new小结(转载)</title><link>http://www.cppblog.com/Marcky/archive/2009/12/06/102666.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Sun, 06 Dec 2009 14:01:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/12/06/102666.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/102666.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/12/06/102666.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/102666.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/102666.html</trackback:ping><description><![CDATA[<div>发信人: nichloas (nil), 信区: CPlusPlus</div><div>标 &nbsp;题: [FAQ] 二维数组new小结</div><div>发信站: BBS 水木清华站 (Sat Jun &nbsp;7 15:27:42 2003), 转信</div><div><br></div><div>1.</div><div>&nbsp;&nbsp; &nbsp;A (*ga)[n] = new A[m][n];</div><div>&nbsp;&nbsp; &nbsp;...</div><div>&nbsp;&nbsp; &nbsp;delete []ga;</div><div>缺点：n必须是已知</div><div>优点：调用直观，连续储存，程序简洁(经过测试，析构函数能正确调用)</div><div><br></div><div>2. &nbsp;A** ga = new A*[m];</div><div>&nbsp;&nbsp; &nbsp;for(int i = 0; i &lt; m; i++)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ga[i] = new A[n];</div><div>&nbsp;&nbsp; &nbsp;...</div><div>&nbsp;&nbsp; &nbsp;for(int i = 0; i &lt; m; i++)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;delete []ga[i];</div><div>&nbsp;&nbsp; &nbsp;delete []ga;</div><div>缺点：非连续储存，程序烦琐，ga为A**类型</div><div>优点：调用直观，n可以不是已知</div><div><br></div><div>3. &nbsp;A* ga = new A[m*n];</div><div>&nbsp;&nbsp; &nbsp;...</div><div>&nbsp;&nbsp; &nbsp;delete []ga;</div><div>缺点：调用不够直观</div><div>优点：连续储存，n可以不是已知</div><div><br></div><div>4. &nbsp;vector&lt;vector&lt;A&gt; &gt; ga;</div><div>&nbsp;&nbsp; &nbsp;ga.resize(m); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //这三行可用可不用</div><div>&nbsp;&nbsp; &nbsp;for(int i = 1; i &lt; n; i++) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ga[i].resize(n); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//</div><div>&nbsp;&nbsp; &nbsp;...</div><div><br></div><div>缺点：非连续储存，调试不够方便，编译速度下降，程序膨胀(实际速度差别不大)</div><div>优点：调用直观，自动析构与释放内存，可以调用stl相关函数，动态增长</div><div><br></div><div>5. &nbsp;vector&lt;A&gt; ga;</div><div>&nbsp;&nbsp; &nbsp;ga.resize(m*n);</div><div>方法3,4的结合</div><div><br></div><div><br></div><div>6. 2的改进版(Penrose提供，在此感谢)</div><div>&nbsp;&nbsp; &nbsp;A** ga = new A*[m];</div><div>&nbsp;&nbsp; &nbsp;ga[0] = new A[m*n];</div><div>&nbsp;&nbsp; &nbsp;for(int i = 1; i &lt; m; i++)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ga[i] = ga[i-1]+n;</div><div>&nbsp;&nbsp; &nbsp;...</div><div>&nbsp;&nbsp; &nbsp;delete [] ga[0];</div><div>&nbsp;&nbsp; &nbsp;delete [] ga;</div><div>缺点：程序烦琐，ga为A**类型</div><div>优点：连续储存，调用直观，n可以不是已知</div><div><br></div><div><br></div><div><br></div><div>附：1,2,3,6还有对应的malloc-free版本</div><div>个人推荐1和4,2可以用4来代替，3,5调用太烦琐，毕竟源程序是拿来看的</div><div>不是拿来运行的</div><div><br></div><div><br></div><div>下面是一些错误和没成功的版本</div><div><br></div><div>1. A* ga = new A[m][n];</div><div>&nbsp;&nbsp;必然错误</div><div><br></div><div>2. vector&lt;A[n]&gt; ga;</div><div>&nbsp;&nbsp; ga.resize(m);</div><div><br></div><div>&nbsp;&nbsp; gcc 3.2下编译失败，不知道其它编译器效果如何</div><div>&nbsp;&nbsp; 也不知道标准是否允许</div><div><br></div><div>我知道的就这些，欢迎大家补充，指正</div><div><br></div><div><br></div><div><br></div><div><br></div><div>--</div><div><br></div><div><br></div><div><br></div><div>--</div><div><br></div><div>※ 来源:&#183;BBS 水木清华站 smth.org&#183;[FROM: 162.105.216.213]</div><div>※ 修改:&#183;devilphoenix 于 Sep &nbsp;5 18:10:57 修改本文&#183;[FROM: 211.99.222.*]</div><div><br></div>
<img src ="http://www.cppblog.com/Marcky/aggbug/102666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-12-06 22:01 <a href="http://www.cppblog.com/Marcky/archive/2009/12/06/102666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HuffmanTree的创建及编码</title><link>http://www.cppblog.com/Marcky/archive/2009/09/28/97474.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Mon, 28 Sep 2009 09:49:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/09/28/97474.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/97474.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/09/28/97474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/97474.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/97474.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">typedef&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_HTNode&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;weight;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;权值&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;parent;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;父节点索引&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;lchild;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;左孩子索引&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;rchild;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;右孩子索引&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>}&nbsp;HTNode,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">HuffmanTree;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;动态分配数组存储哈夫曼树&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br>typedef&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">HuffmanCode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;动态分配数组存储哈夫曼编码表&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;从ht的1～n的节点中找出权值最小的两个节点，分别存于s1,&nbsp;s2中&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Select(HuffmanTree&nbsp;ht,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">s1,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">s2)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">s1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">s2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">设置s1,&nbsp;s2到开始两个parent等于0的节点位置</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">s1&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">s2&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(ht[i].parent&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">s1&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">s1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i&nbsp;:&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">s2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">找出ht中parent等于0，且权值最小的两个节点位置，分别存于s1,&nbsp;s2中</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(ht[i].parent&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(ht[</span><span style="color: #000000;">*</span><span style="color: #000000;">s1].weight&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;ht[</span><span style="color: #000000;">*</span><span style="color: #000000;">s2].weight)&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;(ht[</span><span style="color: #000000;">*</span><span style="color: #000000;">s1].weight&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;ht[i].weight))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">s1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(ht[</span><span style="color: #000000;">*</span><span style="color: #000000;">s2].weight&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;ht[</span><span style="color: #000000;">*</span><span style="color: #000000;">s1].weight)&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;(ht[</span><span style="color: #000000;">*</span><span style="color: #000000;">s2].weight&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;ht[i].weight))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">s2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;通过w存储的n个权值，来创建一颗哈夫曼树,&nbsp;ht_ptr指向这颗哈夫曼树&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;CreateHuffmanTree(HuffmanTree&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">w,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;m;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;s1,&nbsp;s2;<br>&nbsp;&nbsp;&nbsp;&nbsp;HuffmanTree&nbsp;p;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(n&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;n个字符，需要2n-1个空间来存储整颗huffman&nbsp;tree&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(HuffmanTree)malloc(&nbsp;(m&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(HTNode));&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;0号单元不用&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i,&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">p,&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">w)&nbsp;{&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;初始化数组中前n个单元存储的字符&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">weight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">w;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">parent&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lchild&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">rchild&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;m;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i,&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">p)&nbsp;{&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;初始化数组中剩余的单元&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">weight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">parent&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lchild&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">rchild&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;m;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select(</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr,&nbsp;i&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">s1,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">s2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;设置s1,&nbsp;s2的父亲为i&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;s1)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">parent&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;s2)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">parent&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;设置i的左孩子为s1,&nbsp;右孩子为s2&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;i)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lchild&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;s1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;i)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">rchild&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;s2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;设置i的权值为s1,&nbsp;s2之和&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;i)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">weight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;s1)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">weight&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;s2)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">weight;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;对ht_ptr存储的哈夫曼树的n个叶子节点进行哈夫曼编码&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;HuffmanCoding(HuffmanTree&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr,&nbsp;HuffmanCode&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">hc_ptr,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;start;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">cd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">hc_ptr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(HuffmanCode)malloc(&nbsp;(n&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;cd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc(n&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">));<br>&nbsp;&nbsp;&nbsp;&nbsp;cd[n&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">\0</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;current,&nbsp;father;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(current&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i,&nbsp;father&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;i)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">parent;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;从叶子节点开始，并取得父节点father&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;father&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;">&nbsp;父节点为0时及到达了根节点&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;father,&nbsp;father&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;father)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">parent)&nbsp;{&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;逐渐向根节点靠拢&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">ht_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;father)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lchild&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;current)&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;当前节点为左孩子&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cd[</span><span style="color: #000000;">--</span><span style="color: #000000;">start]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cd[</span><span style="color: #000000;">--</span><span style="color: #000000;">start]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">1</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #000000;">hc_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;i)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc(&nbsp;(n&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;start)&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(</span><span style="color: #000000;">*</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #000000;">hc_ptr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">i),&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">cd[start]);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;free(cd);<br>}<br><br></span></div>
<br><img src ="http://www.cppblog.com/Marcky/aggbug/97474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-09-28 17:49 <a href="http://www.cppblog.com/Marcky/archive/2009/09/28/97474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉树的创建及遍历（递归代码）</title><link>http://www.cppblog.com/Marcky/archive/2009/09/24/97173.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Thu, 24 Sep 2009 14:33:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/09/24/97173.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/97173.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/09/24/97173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/97173.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/97173.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">typedef enum</span><span style="color: #000000;"> _STATUS&nbsp;{ERROR,&nbsp;OK} STATUS;<br><br>typedef&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_BiTNode&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;data;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_BiTNode&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">lchild;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_BiTNode&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">rchild;<br>}&nbsp;BiTNode,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">BiTree;<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">创建二叉树</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>STATUS&nbsp;CreateBiTree(BiTree&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">T)<br>{</span><span style="color: #008000;">/*</span><span style="color: #008000;">按先序次序输入二叉树节点的值，空格表示空树。</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%c</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ch);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(ch&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">T&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #000000;">T&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(BiTNode&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc(</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(BiTNode))))&nbsp;exit(</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">T)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">data&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ch;&nbsp;&nbsp;&nbsp;&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;">生成根节点</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateBiTree(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">((</span><span style="color: #000000;">*</span><span style="color: #000000;">T)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lchild));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">构造左子树</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateBiTree(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">((</span><span style="color: #000000;">*</span><span style="color: #000000;">T)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">rchild));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">构造右子树</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;OK;<br>}<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">中序遍历二叉树</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>STATUS InOrderTraverse(BiTree&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">T)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">T)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(InOrderTraverse(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">((</span><span style="color: #000000;">*</span><span style="color: #000000;">T)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lchild)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%c&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">T)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">data);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(InOrderTraverse(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">((</span><span style="color: #000000;">*</span><span style="color: #000000;">T)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">rchild)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;OK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;ERROR;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;OK;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br>  <img src ="http://www.cppblog.com/Marcky/aggbug/97173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-09-24 22:33 <a href="http://www.cppblog.com/Marcky/archive/2009/09/24/97173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python的多元赋值方式实现交换两个变量的值</title><link>http://www.cppblog.com/Marcky/archive/2009/08/26/94473.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Wed, 26 Aug 2009 08:44:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/08/26/94473.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/94473.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/08/26/94473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/94473.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/94473.html</trackback:ping><description><![CDATA[利用Python的多元赋值方式可以无须临时中间变量实现两个变量值的交换。<br>代码：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(x,&nbsp;y)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">x&nbsp;=&nbsp;1,&nbsp;y&nbsp;=&nbsp;2</span><span style="color: #008000;"><br></span><span style="color: #000000;">(x,&nbsp;y)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(y,&nbsp;x)&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">x&nbsp;=&nbsp;2,&nbsp;y&nbsp;=&nbsp;1</span></div>
<br><img src ="http://www.cppblog.com/Marcky/aggbug/94473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-08-26 16:44 <a href="http://www.cppblog.com/Marcky/archive/2009/08/26/94473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>system V IPC —— 共享内存(下)</title><link>http://www.cppblog.com/Marcky/archive/2009/08/20/93911.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Thu, 20 Aug 2009 06:57:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/08/20/93911.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/93911.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/08/20/93911.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/93911.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/93911.html</trackback:ping><description><![CDATA[使用共享内存和记录锁实例。本例中，父进程创建一段共享内存，然后向其中追加字符串"Parent"(在写入&#8220;Parent&#8221;的时候，采用一个字符一个字符的写入，目的是为了验证记录锁对父子进程同步的正确性)；子进程向共享内存中追加字符串&#8220;Child&#8221;（同样是一个一个的字符写入）。由于记录锁是针对文件的，所以得先创建一个空文件作为记录锁的操作对象，作为共享内存访问的辅助工具，如果一个进程对这个空文件加写锁成功后，就开始访问共享内存，访问结束就对文件解锁。<br><br>代码如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdlib.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">types.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">wait.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">fcntl.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">ipc.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">shm.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;SHM_SIZE&nbsp;1024&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;shared&nbsp;memory&nbsp;size(bytes)&nbsp;*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;SHM_MODE&nbsp;0600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;user&nbsp;read/write&nbsp;*/</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;WRITE_LOCK(fd)&nbsp;regLock((fd),&nbsp;F_SETLKW,&nbsp;F_WRLCK,&nbsp;0,&nbsp;SEEK_SET,&nbsp;0)&nbsp;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;UN_LOCK(fd)&nbsp;regLock((fd),&nbsp;F_SETLK,&nbsp;F_UNLCK,&nbsp;0,&nbsp;SEEK_SET,&nbsp;0)&nbsp;</span><span style="color: #000000;"><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;创建一个文件&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;createFile()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;fd;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(fd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;open(</span><span style="color: #000000;">"</span><span style="color: #000000;">/tmp/emptyfile4shm</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;O_RDWR&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;O_CREAT,&nbsp;</span><span style="color: #000000;">0666</span><span style="color: #000000;">))&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Create&nbsp;a&nbsp;empty&nbsp;file&nbsp;failed!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;fd;<br>}<br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;在文件fd上加锁或解锁</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;regLock(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;fd,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;cmd,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;type,&nbsp;off_t&nbsp;offset,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;whence,&nbsp;off_t&nbsp;len)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;flock&nbsp;</span><span style="color: #0000ff;">lock</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">lock</span><span style="color: #000000;">.l_type&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;lock&nbsp;type:&nbsp;F_RDLCK,&nbsp;F_WRLCK,&nbsp;F_UNLCK&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">lock</span><span style="color: #000000;">.l_start&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;offset;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;byte&nbsp;offset&nbsp;relative&nbsp;to&nbsp;l_whence&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">lock</span><span style="color: #000000;">.l_whence&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;whence;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;it's&nbsp;value&nbsp;:&nbsp;SEEK_SET,&nbsp;SEEK_CUR,&nbsp;SEEK_END&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">lock</span><span style="color: #000000;">.l_len&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;len;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;bytes&nbsp;(0&nbsp;means&nbsp;to&nbsp;EOF)&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;fcntl(fd,&nbsp;cmd,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #0000ff;">lock</span><span style="color: #000000;">);<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;shmid;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;filed;<br>&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;pid;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">shmptr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;filed&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;createFile();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(shmid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;shmget(IPC_PRIVATE,&nbsp;SHM_SIZE,&nbsp;SHM_MODE))&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Create&nbsp;shared&nbsp;memory&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Create&nbsp;shared&nbsp;memory&nbsp;failed!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(pid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fork())&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Create&nbsp;a&nbsp;child&nbsp;process&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Create&nbsp;child&nbsp;process&nbsp;failed!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(pid&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;In&nbsp;child&nbsp;process&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(shmptr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;shmat(shmid,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Attached&nbsp;shared&nbsp;memory&nbsp;failed!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WRITE_LOCK(filed);&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;add&nbsp;a&nbsp;write&nbsp;lock&nbsp;to&nbsp;filed&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;shared&nbsp;memory&nbsp;剩余的空间不能存储"Child"字符串和结束符0时就退出循环&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(SHM_SIZE&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;strlen(shmptr)&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;strlen(</span><span style="color: #000000;">"</span><span style="color: #000000;">Child</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(shmptr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">C</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;由于加了锁，每个Child将会连续出现&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(shmptr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">h</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(shmptr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">i</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(shmptr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">l</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(shmptr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">d</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UN_LOCK(filed);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;release&nbsp;lock&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">child&nbsp;process:\n\t%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;shmptr);&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;child&nbsp;process&nbsp;print&nbsp;shared&nbsp;memory&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;In&nbsp;parent&nbsp;process&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(shmptr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;shmat(shmid,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Attached&nbsp;shared&nbsp;memory&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Attached&nbsp;shared&nbsp;memory&nbsp;failed!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WRITE_LOCK(filed);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;shared&nbsp;memory&nbsp;剩余的空间不能存储"Parent"字符串和结束符0时就退出循环&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(SHM_SIZE&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;strlen(shmptr)&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;strlen(</span><span style="color: #000000;">"</span><span style="color: #000000;">Parent</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(shmptr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">P</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;由于加了锁，每个Parent将会连续出现&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(shmptr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">a</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(shmptr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">r</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(shmptr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">e</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(shmptr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(shmptr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">t</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UN_LOCK(filed);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">parent&nbsp;process:\n\t%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;shmptr);&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;parent&nbsp;print&nbsp;shared&nbsp;memory&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;wait(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br></span></div>
<br><br><img src ="http://www.cppblog.com/Marcky/aggbug/93911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-08-20 14:57 <a href="http://www.cppblog.com/Marcky/archive/2009/08/20/93911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>system V IPC —— 共享内存(上)</title><link>http://www.cppblog.com/Marcky/archive/2009/08/20/93909.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Thu, 20 Aug 2009 06:48:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/08/20/93909.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/93909.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/08/20/93909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/93909.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/93909.html</trackback:ping><description><![CDATA[共享内存允许多个进程共享一给定的存储区。因为数据不需要在两个进程之间进行copy，所以这是最快的一种IPC。使用共享内存技术的时候，需要掌握好的是多个进程之间如何同步。信号量和记录锁可以用来实现共享内存的多个进程之间的同步。<br><br>linux内核定义的shared memory结构shmid_ds如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;shmid_ds&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;ipc_perm&nbsp;&nbsp;shm_perm;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">权限</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shm_segsz;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">大小</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shm_lpid;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shm_cpid;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">创建者pid</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;shmatt_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shm_nattch;</span><span style="color: #008000;">/*</span><span style="color: #008000;">连接到此段内存的进程数</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shm_atime;<br>&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shm_dtime;<br>&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shm_ctime;<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br>};</span></div>
<br>1、创建或使用一段共享内存使用shmget函数，此函数将返回共享内存标示符。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">shm.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;shmget(key_t key,&nbsp;size_t&nbsp;size,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;flag);</span></div>
如果key取值为IPC_PRIVATE或者key当前为和特定类型的IPC结构相结合，并且flag指定了IPC_CREAT位，则创建一个新的share memory结构。<br>size为共享内存段的长度（字节）。<br><br>2、对一个共享内存段进行操作使用shmctl。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">shm.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;shmctl(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;shmid,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;cmd,&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;shmid_ds&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">buf);</span></div>
shmid指定需要操作的shared memory<br>cmd指定需要进行的操作<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPC_STAT取得此段的shmid_ds结构放入buf中。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPC_SET用buf的值设置此段中的：shm_perm.uid，shm_perm.gid，shm_perm.mode。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPC_RMID从系统中删除此共享内存段。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHM_LOCK将共享内存锁定到内存中。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHM_UNLOCK解锁共享内存段。<br><br>3、将一个共享内存段连接到自己的地址空间使用shmat：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">shm.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">shmat(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;shmid,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">addr,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;flag);</span></div>
推荐addr取0值，将此段连接到内核选择的第一个可用的地址上。增加程序的可移植性。<br><br>4、对共享内存操作结束后，要脱离该段用shmdt：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">shm.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;shmdt(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">addr);</span></div>
addr是shmat的返回值。<br><br> <img src ="http://www.cppblog.com/Marcky/aggbug/93909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-08-20 14:48 <a href="http://www.cppblog.com/Marcky/archive/2009/08/20/93909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安全访问数组的指针类模板</title><link>http://www.cppblog.com/Marcky/archive/2009/08/13/93233.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Thu, 13 Aug 2009 10:29:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/08/13/93233.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/93233.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/08/13/93233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/93233.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/93233.html</trackback:ping><description><![CDATA[在用数组作为数据结构存储数据的时候，一不小心就访问越界了，这类错误有时候很不容易发现。为此自己封装一个专门用来访问数组元素的指针类模板。此类模板需要数组的元素类型，起始地址，大小来构造一个安全的Ptr2T指针对象，此对象访问数组的方法不但与普通的指针相同，同时还增加了越界的安全检查。<br><span style="color: #000000;"></span><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><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>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdexcept</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></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><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Ptr2T&nbsp;{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008000;">//</span><span style="color: #008000;">构造函数，形参为数组起始地址和大小</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T(T&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">p,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;size)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;m_p(p),&nbsp;m_array(p),&nbsp;m_size(size)&nbsp;{&nbsp;};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">++</span><span style="color: #000000;">();&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;">前缀++</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">++</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">后缀++</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">--</span><span style="color: #000000;">();&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;">前缀--</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">--</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">后缀--</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">+=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n);<br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n);<br></span><span style="color: #008000;">//</span><span style="color: #008000;">安全的数组元素访问操作</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">*</span><span style="color: #000000;">()&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;&nbsp;&nbsp;<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">m_p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">访问数组的指针</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">m_array;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">保存数组的起始地址</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;m_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">保存数组的大小</span><span style="color: #008000;"><br></span><span style="color: #000000;">};<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">++</span><span style="color: #000000;">()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_p&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">++</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T&nbsp;current&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用重载的前缀++来实现</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;current;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">--</span><span style="color: #000000;">()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_p&nbsp;</span><span style="color: #000000;">-=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">--</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T&nbsp;current&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用重载的前缀--来实现</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;current;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">*</span><span style="color: #000000;">()&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;"><br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(m_p&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;m_array&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;m_p&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;m_array&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;m_size&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">越界检查</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;out_of_range(</span><span style="color: #000000;">"</span><span style="color: #000000;">out&nbsp;of&nbsp;range</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">m_p;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">+=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_p&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;n;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">-=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_p&nbsp;</span><span style="color: #000000;">-=</span><span style="color: #000000;">&nbsp;n;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">+</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">p,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(p)&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;n;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用重载的+=来实现</span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">+</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">p)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;p&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;n;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">-</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">p,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(p)&nbsp;</span><span style="color: #000000;">-=</span><span style="color: #000000;">&nbsp;n;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用重载的-=来实现</span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">使用方法</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;a[</span><span style="color: #000000;">5</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">'</span><span style="color: #000000;">a</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">b</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">c</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">d</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">e</span><span style="color: #000000;">'</span><span style="color: #000000;">};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;b[</span><span style="color: #000000;">5</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">};&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;pc(a,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;pi(b,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pc</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;pi</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;pi&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">(pi&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*++</span><span style="color: #000000;">pi&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pi&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br></span></div>
<br><img src ="http://www.cppblog.com/Marcky/aggbug/93233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-08-13 18:29 <a href="http://www.cppblog.com/Marcky/archive/2009/08/13/93233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>显示构造函数与转换运算符的合作</title><link>http://www.cppblog.com/Marcky/archive/2009/08/13/93193.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Thu, 13 Aug 2009 06:39:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/08/13/93193.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/93193.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/08/13/93193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/93193.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/93193.html</trackback:ping><description><![CDATA[在设计一个Date类的时候，我们使用int类型来表示年份，如果我们需要对年份进行一些特殊的操作（如：检查，保护等），就很需要定义一个Year类，如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Year&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;m_y;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008000;">//</span><span style="color: #008000;">explicit限制int到Year的隐式转换</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">explicit</span><span style="color: #000000;">&nbsp;Year(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;y(m_y)&nbsp;{&nbsp;}<br></span><span style="color: #008000;">//</span><span style="color: #008000;">Year到int的类型转换&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">()&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;m_y;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">other&nbsp;funtion<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br><br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Date&nbsp;{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;:<br>&nbsp;&nbsp;&nbsp;&nbsp;Date(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;d,&nbsp;Month&nbsp;m,&nbsp;Year&nbsp;y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000;"><br></span><span style="color: #000000;">};<br><br>Date&nbsp;d1(</span><span style="color: #000000;">1987</span><span style="color: #000000;">,&nbsp;feb,&nbsp;</span><span style="color: #000000;">21</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">error,&nbsp;21不能隐式转换为Year</span><span style="color: #008000;"><br></span><span style="color: #000000;">Date&nbsp;d2(</span><span style="color: #000000;">21</span><span style="color: #000000;">,&nbsp;feb,&nbsp;Year(</span><span style="color: #000000;">1987</span><span style="color: #000000;">));&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">ok</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br><br></span></div>
</span></div>
<br>在这里Year就只是包裹住了int，对int提供一层保护而已。由于operator int()的存在，只要需要，Year可以隐式的转化为int出现运算表达式中参加运算。而通过给构造函数声明为explicit，就能够保证，int到Year的转化只能在明确无误的情况进行，避免了意外的赋值。<br><br>显示构造函数和转换运算符的合作，让Year可以当int使用，同时又对Year进行一定的保护。。。<br><br><br> <img src ="http://www.cppblog.com/Marcky/aggbug/93193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-08-13 14:39 <a href="http://www.cppblog.com/Marcky/archive/2009/08/13/93193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Allocating Arrays Using Placement new (zz)</title><link>http://www.cppblog.com/Marcky/archive/2009/08/13/93110.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Wed, 12 Aug 2009 16:48:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/08/13/93110.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/93110.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/08/13/93110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/93110.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/93110.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; An additional version of operator
<tt>new</tt> enables you to construct an
object or an array of objects at a predetermined memory position. This version
is called <em>placement new</em> and has many useful applications, including
building a custom-made memory pool or a garbage collector. Additionally, it can
be used in mission-critical applications because there's no danger of
allocation failure; the memory that's used by placement
<tt>new</tt> has
already been allocated. Placement
<tt>new</tt> is also faster because the
construction of an object on a preallocated buffer takes less time.
<br><br>
<p>You already know how to use <a href="http://www.informit.com/guides/content.aspx?g=cplusplus&amp;seqNum=38">placement
<tt>new</tt></a>
to allocate a single object on a predetermined memory address. However,
some programming tasks require the allocation of arrays on a
predetermined memory address. Here's how you do it.</p>
<h4>Placement
<tt>new</tt> Overview</h4>
<p>Mobile devices, embedded systems and custom garbage collectors are
only a few instances of programming environments that may require
placement
<tt>new</tt> allocation of arrays. Before I discuss the
details of such array allocations, let's remind ourselves briefly how
scalar (i.e. non-array) placement
<tt>new</tt> works.</p>
<p>The scalar version of placement
<tt>new</tt> takes a user-supplied address on which it constructs a single object. Unlike the ordinary version of the
<tt>new</tt> operator, placement
<tt>new</tt> doesn't allocate storage for the object; it merely constructs the object on the memory address you provide:</p>
<p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">required&nbsp;for&nbsp;using&nbsp;placement&nbsp;new</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Widget&nbsp;{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;Widget();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">Widget<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Draw();<br>};<br></span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;buf</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;[</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">&nbsp;(Widget)];</span><span style="color: #008000;">//</span><span style="color: #008000;">preallocate</span><span style="color: #008000;"><br></span><span style="color: #000000;">Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;widget</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">(buf)&nbsp;Widget;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">construct&nbsp;Widget&nbsp;on&nbsp;buf</span><span style="color: #008000;"><br></span><span style="color: #000000;">widget</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Draw();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">use&nbsp;Widget</span></div>
<br></p>
<p>To destroy
<tt>widget</tt> you first have to invoke its destructor explicitly:</p>
<span style="font-family: monospace;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">widget</span><span style="color: #000000;">-&gt;~</span><span style="color: #000000;">Widget();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">explicit&nbsp;destructor&nbsp;invocation</span></div>
<br></span>
<p>Next, reclaim the raw memory like this:</p>
<p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">delete[]&nbsp;buf;</span></div>
<span style="font-weight: bold;"><br></span></p>
<p><span style="font-weight: bold;">Array Allocation</span></p>
<p>Allocating arrays with placement
<tt>new</tt> follows the same steps more or less, but you have to pay attention to additional nuances. Here is a step-by-step guide:</p>
<p>First, allocate a buffer large enough to hold an array of the desired type:</p>
<span style="font-family: monospace;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;ARRSIZE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;buf</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;[</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(Widget)</span><span style="color: #000000;">*</span><span style="color: #000000;">ARRSIZE];</span></div>
<br></span>
<p>Don't be tempted to calculate the size manually; always use
<tt>sizeof</tt> to ensure that the buffer is properly aligned and has the right size.</p>
<p>Next, construct an array of
<tt>ARRSIZE</tt> objects on the buffer using placement
<tt>new[]</tt> :</p>
<span style="font-family: monospace;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;widgets</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">(buf)&nbsp;Widget[ARRSIZE];</span><span style="color: #008000;">//</span><span style="color: #008000;">construct&nbsp;an&nbsp;array</span></div>
<br></span>
<p>You can now use the allocated array as usual:</p>
<pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;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;">ARRSIZE;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>{<br>&nbsp;widgets[i].Draw();<br>}</span></div>
Make sure that your target class --
<tt>Widget</tt> in this example -- has a public default constructor. Otherwise, it would be impossible to create arrays thereof.</pre>
<h4>Destroying the Array</h4>
<p>To destroy such an array allocated by placement
<tt>new</tt> you have to call the destructor for each element explicitly:</p>
<span style="font-family: monospace;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">ARRSIZE;<br></span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(i)<br>&nbsp;&nbsp;&nbsp;&nbsp;widgets[</span><span style="color: #000000;">--</span><span style="color: #000000;">i].</span><span style="color: #000000;">~</span><span style="color: #000000;">Widget();</span></div>
<br></span>
<p>The
<tt>while</tt> -loop uses a descending order to preserve the
canonical destruction order of C++ -- the object that was constructed
last must be destroyed first. To comply with this requirement, the
element with the highest index is destroyed first.</p>
<p>Finally, you release the raw memory on which the array resided by calling
<tt>delete[]</tt> :</p>
<pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">delete[]&nbsp;buf;</span></div>
<br></pre>
<h4>Performance Tuning</h4>
<p>The array placement
<tt>new</tt> has a potential performance
problem: it initializes every element in the array unconditionally. If
your app deals with large arrays, this isn't the most efficient way. In
some apps only a portion of the array is actually used, and in other
apps the elements are assigned a different value immediately after
their construction. In these cases, you want to postpone, or even
completely avoid, the automatic initialization of array elements. To
avoid the initialization of placement
<tt>new</tt> arrays, follow the following steps:</p>
<p>As before, begin with an allocation of a raw buffer with the appropriate size. This time however, use the global operator
<tt>new</tt> instead of the
<tt>new</tt> operator:</p>
<pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">Widget&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;warr</span><span style="color: #000000;">=</span><span style="color: #000000;"><br>static_cast</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Widget</span><span style="color: #000000;">*&gt;</span><span style="color: #000000;">&nbsp;(::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(Widget)</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;ARRSIZE));</span></div>
<br></pre>
<p>The global operator
<tt>new</tt> , very much like C's
<tt>malloc()</tt> , merely allocates raw bytes of memory from the free-store, without initializing them. It returns
<tt>void * </tt>rather than
<tt>Widget*</tt> which is why you need to cast the result explicitly.</p>
<p>At this stage,
<tt>warr</tt> is a pointer to raw memory. You can't
access its elements because they haven't been initialized yet. To
initialize individual elements, call placement
<tt>new</tt> once more, for each element you want initialized:</p>
<pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;assign(Widget&nbsp;arr[],&nbsp;size_t&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;sz,&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Widget</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;init)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">arr[sz</span><span style="color: #000000;">++</span><span style="color: #000000;">])&nbsp;Widget&nbsp;(init);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">invoke&nbsp;copy&nbsp;ctor</span><span style="color: #008000;"><br></span><span style="color: #000000;">}</span></div>
<br></pre>
<p>
<tt>assign()</tt> passes the address of an individual element to placement
<tt>new</tt> which in turn invokes
<tt>Widget</tt> 's copy constructor. The copy-constructor initializes that element with
<tt>init</tt> . Using this technique, you can initialize elements selectively, leaving the rest of the array uninitialized.</p>
<p>To destroy such an array, invoke the destructor of every initialized object. Then call the global operator
<tt>delete</tt> to reclaim the raw storage:</p>
<pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;destroy(Widget&nbsp;arr[],&nbsp;size_t&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;sz)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(sz)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr[</span><span style="color: #000000;">--</span><span style="color: #000000;">sz].</span><span style="color: #000000;">~</span><span style="color: #000000;">Widget();</span><span style="color: #008000;">//</span><span style="color: #008000;">destroy&nbsp;all&nbsp;initialized&nbsp;elements</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;delete&nbsp;(arr);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">reclaim&nbsp;raw&nbsp;storage</span><span style="color: #008000;"><br></span><span style="color: #000000;">}</span></div>
<br></pre>
<h4>Summary</h4>
<p>The techniques I've presented here are bug prone. Therefore, they
should be encapsulated in higher-level classes that hide the
implementation details from users. These techniques aren't rarely-used
as they might seem. STL allocators use them under the hood to avoid
object initialization and minimize reallocations.</p>
<br><br><img src ="http://www.cppblog.com/Marcky/aggbug/93110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-08-13 00:48 <a href="http://www.cppblog.com/Marcky/archive/2009/08/13/93110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个Python文本处理程序</title><link>http://www.cppblog.com/Marcky/archive/2009/07/22/90839.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Wed, 22 Jul 2009 08:33:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/07/22/90839.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/90839.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/07/22/90839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/90839.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/90839.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 文本内容为一行一个单词，如下：<br>some<br>are<br>born<br>great&nbsp;&nbsp;<a href='http://www.cppblog.com/Marcky/archive/2009/07/22/90839.html'>阅读全文</a><img src ="http://www.cppblog.com/Marcky/aggbug/90839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-07-22 16:33 <a href="http://www.cppblog.com/Marcky/archive/2009/07/22/90839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>