??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久久久97,久久亚洲av无码精品浪潮,久久亚洲天堂http://m.shnenglu.com/yishanhante/category/3655.htmlzh-cnTue, 20 May 2008 21:12:39 GMTTue, 20 May 2008 21:12:39 GMT60C++内存理详解Q三Q?/title><link>http://m.shnenglu.com/yishanhante/articles/18965.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Sun, 25 Feb 2007 06:42:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/18965.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/18965.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/18965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/18965.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/18965.html</trackback:ping><description><![CDATA[ <div> <strong> <span style="FONT-SIZE: 14pt">7</span> </strong> <strong> <span style="FONT-SIZE: 14pt">、内存耗尽怎么办?</span> </strong> </div> <div style="TEXT-INDENT: 21pt">如果在申请动态内存时找不到够大的内存块Qmalloc和new返回NULL指针Q宣告内存申请失败。通常有三U方式处理“内存耗尽”问题? <table height="250" cellspacing="0" cellpadding="0" width="300" align="right" summary="" border="0"><tbody><tr><td>  <script type="text/javascript"><!-- google_ad_client = "pub-2299987709779770"; google_ad_width = 300; google_ad_height = 250; google_ad_format = "300x250_as"; google_ad_type = "text_image"; google_ad_channel =""; google_color_border = "FFFFFF"; google_color_bg = "FFFFFF"; google_color_link = "0000FF"; google_color_url = "008000"; google_color_text = "000000"; //--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></td></tr></tbody></table></div> <div style="TEXT-INDENT: 21pt"> </div> <div style="TEXT-INDENT: 21pt">Q?Q判断指针是否ؓNULLQ如果是则马上用return语句l止本函数。例如:</div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void Func(void)<br />{<br /> A *a = new A;<br /> if(a == NULL)<br /> {<br />  return;<br /> }<br /> ?br />}<br /><br /></div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt">Q?Q判断指针是否ؓNULLQ如果是则马上用exit(1)l止整个E序的运行。例如:</div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void Func(void)<br />{<br /> A *a = new A;<br /> if(a == NULL)<br /> {<br />  cout << “Memory Exhausted?<< endl;<br />  exit(1);<br /> }<br /> ?br />}</div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> </div> <div style="TEXT-INDENT: 21pt"> </div> <div style="TEXT-INDENT: 21pt">Q?Qؓnew和malloc讄异常处理函数。例如Visual C++可以用_set_new_hander函数为new讄用户自己定义的异常处理函敎ͼ也可以让malloc享用与new相同的异常处理函数。详l内容请参考C++使用手册?br /><br />  上述Q?Q(2Q方式用最普遍。如果一个函数内有多处需要申请动态内存,那么方式Q?Q就昑־力不从心Q释攑ֆ存很ȝQ,应该用方式(2Q来处理?br /><br />  很多Z忍心用exit(1)Q问Q“不~写出错处理E序Q让操作pȝ自己解决行不行??br /><br />  不行。如果发生“内存耗尽”这L事情Q一般说来应用程序已l无药可救。如果不用exit(1) 把坏E序杀死,它可能会x操作pȝ。道理如同:如果不把歹徒LQ歹徒在老死之前会犯下更多的|?br /><br />  有一个很重要的现象要告诉大家。对?2位以上的应用E序而言Q无论怎样使用malloc与newQ几乎不可能D“内存耗尽”。我在Windows 98下用Visual C++~写了测试程序,见示?。这个程序会无休止地q行下去Q根本不会终止。因?2位操作系l支持“虚存”,内存用完了,自动用硬盘空间顶ѝ我只听到硬盘嘎吱嘎吱地响,Window 98已经累得寚w盘、鼠标毫无反应?br /><br />  我可以得么一个结论:对于32位以上的应用E序Q“内存耗尽”错误处理程序毫无用处。这下可把Unix和WindowsE序员们乐坏了:反正错误处理E序不v作用Q我׃写了Q省了很多麻烦?br /><br />  我不惌D者,必须Q不加错误处理将DE序的质量很差,千万不可因小失大?/div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void main(void)<br />{<br /> float *p = NULL;<br /> while(TRUE)<br /> {<br />  p = new float[1000000];<br />  cout << “eat memory?<< endl;<br />  if(p==NULL)<br />   exit(1);<br /> }<br />}<br /><br />  CZ7试图耗尽操作pȝ的内?/div> </td> </tr> </tbody> </table> <div> </div> <div>8、malloc/free 的用要?br /><br />  函数malloc的原型如下:<br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void * malloc(size_t size);</div> </td> </tr> </tbody> </table> <div> <br /> <br />  用malloc甌一块长度ؓlength的整数类型的内存Q程序如下:<br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>int *p = (int *) malloc(sizeof(int) * length);</div> </td> </tr> </tbody> </table> <div> <br /> <br />  我们应当把注意力集中在两个要素上Q“类型{换”和“sizeof”?br /><br />  * mallocq回值的cd是void *Q所以在调用malloc时要昑ּ地进行类型{换,void * 转换成所需要的指针cd?br /><br />  * malloc函数本nq不识别要申L内存是什么类型,它只兛_内存的d节数。我们通常C住int, float{数据类型的变量的确切字节数。例如int变量?6位系l下?个字节,?2位下?个字节;而float变量?6位系l下?个字节,?2位下也是4个字节。最好用以下E序作一ơ测试:<br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>cout << sizeof(char) << endl;<br />cout << sizeof(int) << endl;<br />cout << sizeof(unsigned int) << endl;<br />cout << sizeof(long) << endl;<br />cout << sizeof(unsigned long) << endl;<br />cout << sizeof(float) << endl;<br />cout << sizeof(double) << endl;<br />cout << sizeof(void *) << endl;</div> </td> </tr> </tbody> </table> <div> <br /> <br />  在malloc的?)”中使用sizeofq算W是良好的风|但要当心有时我们会昏了头Q写?p = malloc(sizeof(p))q样的程序来?br /><br />  * 函数free的原型如下:<br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void free( void * memblock );</div> </td> </tr> </tbody> </table> <div> <br /> <br />  Z么free 函数不象malloc函数那样复杂呢?q是因ؓ指针p的类型以及它所指的内存的容量事先都是知道的Q语句free(p)能正地释放内存。如果p?NULL指针Q那么free对p无论操作多少ơ都不会出问题。如果p不是NULL指针Q那么free对pq箋操作两次׃DE序q行错误?br /><br /><strong><span style="FONT-SIZE: 14pt">9</span></strong><strong><span style="FONT-SIZE: 14pt">?/span></strong><strong><span style="FONT-SIZE: 14pt">new/delete </span></strong><strong><span style="FONT-SIZE: 14pt">的用要?/span></strong></div> <div>  q算Wnew使用h要比函数malloc单得多,例如Q?br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>int *p1 = (int *)malloc(sizeof(int) * length);<br />int *p2 = new int[length];</div> </td> </tr> </tbody> </table> <div> <br /> <br />  q是因ؓnew内置了sizeof、类型{换和cd安全查功能。对于非内部数据cd的对象而言Qnew在创建动态对象的同时完成了初始化工作。如果对象有多个构造函敎ͼ那么new的语句也可以有多UŞ式。例?br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>class Obj<br />{<br /> public :<br />  Obj(void); // 无参数的构造函?br />  Obj(int x); // 带一个参数的构造函?br />  ?br />}<br />void Test(void)<br />{<br /> Obj *a = new Obj;<br /> Obj *b = new Obj(1); // 初gؓ1<br /> ?br /> delete a;<br /> delete b;<br />}<br /><br /></div> </td> </tr> </tbody> </table> <div> <br />  如果用new创徏对象数组Q那么只能用对象的无参数构造函数。例?br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>Obj *objects = new Obj[100]; // 创徏100个动态对?/div> <div>  不能写成<br />Obj *objects = new Obj[100](1);// 创徏100个动态对象的同时赋初?</div> </td> </tr> </tbody> </table> <div> <br />  在用delete释放对象数组Ӟ留意不要丢了W号‘[]’。例?br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>delete []objects; // 正确的用?br />delete objects; // 错误的用?/div> </td> </tr> </tbody> </table> <div> <br /> <br />  后者相当于delete objects[0]Q漏掉了另外99个对象?br /><br /><strong><span style="FONT-SIZE: 14pt">10</span></strong><strong><span style="FONT-SIZE: 14pt">、一些心得体?/span></strong></div> <div style="TEXT-INDENT: 21pt">我认识不技术不错的C++/CE序员,很少有h能拍拍胸脯说通晓指针与内存管理(包括我自己)。我最初学习C语言时特别怕指针,D我开发第一个应用YӞU?万行C代码Q时没有使用一个指针,全用数组来顶替指针,实在蠢笨得过分。躲避指针不是办法,后来我改写了q个软gQ代码量~小到原先的一半?br />  我的l验教训是:</div> <div style="TEXT-INDENT: 21pt">Q?Q越是怕指针,p要用指针。不会正用指针,肯定不上是合格的程序员?/div> <div style="TEXT-INDENT: 21pt">Q?Q必d成“用调试器逐步跟踪E序”的习惯Q只有这h能发现问题的本质?br /></div> <img src ="http://m.shnenglu.com/yishanhante/aggbug/18965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-02-25 14:42 <a href="http://m.shnenglu.com/yishanhante/articles/18965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++内存理详解Q二Q?/title><link>http://m.shnenglu.com/yishanhante/articles/18957.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Sat, 24 Feb 2007 15:43:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/18957.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/18957.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/18957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/18957.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/18957.html</trackback:ping><description><![CDATA[ <div> <strong> <span style="FONT-SIZE: 14pt">4</span> </strong> <strong> <span style="FONT-SIZE: 14pt">、指针参数是如何传递内存的Q? <table height="250" cellspacing="0" cellpadding="0" width="300" align="right" summary="" border="0"><tbody><tr><td>  <script type="text/javascript"><!-- google_ad_client = "pub-2299987709779770"; google_ad_width = 300; google_ad_height = 250; google_ad_format = "300x250_as"; google_ad_type = "text_image"; google_ad_channel =""; google_color_border = "FFFFFF"; google_color_bg = "FFFFFF"; google_color_link = "0000FF"; google_color_url = "008000"; google_color_text = "000000"; //--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></td></tr></tbody></table></span> </strong> </div> <div style="TEXT-INDENT: 21pt">如果函数的参数是一个指针,不要指望用该指针ȝ请动态内存。示?-4-1中,Test函数的语句GetMemory(str, 200)q没有str获得期望的内存,str依旧是NULLQؓ什?</div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void GetMemory(char *p, int num)<br />{<br /> p = (char *)malloc(sizeof(char) * num);<br />}<br />void Test(void)<br />{<br /> char *str = NULL;<br /> GetMemory(str, 100); // str 仍然?NULL<br /> strcpy(str, "hello"); // q行错误<br />}<br />      CZ4.1 试图用指针参数申请动态内?/div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> </div> <div style="TEXT-INDENT: 21pt">毛病出在函数GetMemory中。编译器L要ؓ函数的每个参数制作时副本,指针参数p的副本是 _pQ编译器?_p = p。如果函C内的E序修改了_p的内容,导致参数p的内容作相应的修攏V这是指针可以用作输出参数的原因。在本例中,_p甌了新的内存,只是?_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemoryq不能输ZQ何东ѝ事实上Q每执行一ơGetMemory׃泄露一块内存,因ؓ没有用free释放内存?br /><br />  如果非得要用指针参数ȝ请内存,那么应该改用“指向指针的指针”,见示?.2?/div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void GetMemory2(char **p, int num)<br />{<br /> *p = (char *)malloc(sizeof(char) * num);<br />}<br />void Test2(void)<br />{<br /> char *str = NULL;<br /> GetMemory2(&str, 100); // 注意参数?&strQ而不是str<br /> strcpy(str, "hello");<br /> cout<< str << endl;<br /> free(str);<br />}<br />      CZ4.2用指向指针的指针甌动态内?/div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> </div> <div style="TEXT-INDENT: 21pt"> </div> <div style="TEXT-INDENT: 21pt">׃“指向指针的指针”这个概念不Ҏ理解Q我们可以用函数q回值来传递动态内存。这U方法更加简单,见示?.3?br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>char *GetMemory3(int num)<br />{<br /> char *p = (char *)malloc(sizeof(char) * num);<br /> return p;<br />}<br />void Test3(void)<br />{<br /> char *str = NULL;<br /> str = GetMemory3(100);<br /> strcpy(str, "hello");<br /> cout<< str << endl;<br /> free(str);<br />}<br />       CZ4.3 用函数返回值来传递动态内?/div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> </div> <div style="TEXT-INDENT: 21pt">用函数返回值来传递动态内存这U方法虽然好用,但是常常有h把return语句用错了。这里强调不要用return语句q回指向“栈内存”的指针Q因内存在函数结束时自动消亡Q见CZ4.4?/div> <div style="TEXT-INDENT: 21pt"> </div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>char *GetString(void)<br />{<br /> char p[] = "hello world";<br /> return p; // ~译器将提出警告<br />}<br />void Test4(void)<br />{<br /> char *str = NULL;<br /> str = GetString(); // str 的内Ҏ垃圾<br /> cout<< str << endl;<br />}<br />      CZ4.4 return语句q回指向“栈内存”的指针</div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> </div> <div style="TEXT-INDENT: 21pt"> </div> <div style="TEXT-INDENT: 21pt">用调试器逐步跟踪Test4Q发现执行str = GetString语句后str不再是NULL指针Q但是str的内容不是“hello world”而是垃圾?br />如果把示?.4改写成示?.5Q会怎么P<br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>char *GetString2(void)<br />{<br /> char *p = "hello world";<br /> return p;<br />}<br />void Test5(void)<br />{<br /> char *str = NULL;<br /> str = GetString2();<br /> cout<< str << endl;<br />}<br />     CZ4.5 return语句q回帔R字符?br /><br /></div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> <br /> <br />  函数Test5q行虽然不会出错Q但是函数GetString2的设计概念却是错误的。因为GetString2内的“hello world”是帔R字符Ԍ位于静态存储区Q它在程序生命期内恒定不变。无Z么时候调用GetString2Q它q回的始l是同一个“只诠Z的内存块?/div> <div style="TEXT-INDENT: 21pt"> </div> <div> <strong> <span style="FONT-SIZE: 14pt">5</span> </strong> <strong> <span style="FONT-SIZE: 14pt">、杜l?/span> </strong> <strong> <span style="FONT-SIZE: 14pt">?/span> </strong> <strong> <span style="FONT-SIZE: 14pt">野指?/span> </strong> <strong> <span style="FONT-SIZE: 14pt">?/span> </strong> </div> <div style="TEXT-INDENT: 21pt"> </div> <div style="TEXT-INDENT: 21pt">“野指针”不是NULL指针Q是指向“垃䏀内存的指针。h们一般不会错用NULL指针Q因为用if语句很容易判断。但是“野指针”是很危险的Qif语句对它不v作用?“野指针”的成因主要有两U:<br /><br />  Q?Q指针变量没有被初始化。Q何指针变量刚被创建时不会自动成ؓNULL指针Q它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化Q要么将指针讄为NULLQ要么让它指向合法的内存。例?br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>char *p = NULL;<br />char *str = (char *) malloc(100);</div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> <br /> <br />  Q?Q指针p被free或者delete之后Q没有置为NULLQ让以ؓp是个合法的指针?br /><br />  Q?Q指针操作超了变量的作用范围。这U情况让人防不胜ԌCZE序如下Q?br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>class A<br />{<br /> public:<br />  void Func(void){ cout << “Func of class A?<< endl; }<br />};<br />void Test(void)<br />{<br /> A *p;<br /> {<br />  A a;<br />  p = &a; // 注意 a 的生命期<br /> }<br /> p->Func(); // p是“野指针?br />}<br /><br /></div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> <br /> <br />  函数Test在执行语句p->Func()Ӟ对象a已经消失Q而p是指向a的,所以p成了“野指针”。但奇怪的是我q行q个E序时居然没有出错,q可能与~译器有兟?br /><br /><strong><span style="FONT-SIZE: 14pt">6</span></strong><strong><span style="FONT-SIZE: 14pt">、有?/span></strong><strong><span style="FONT-SIZE: 14pt">malloc/free</span></strong><strong><span style="FONT-SIZE: 14pt">Z么还?/span></strong><strong><span style="FONT-SIZE: 14pt">new/delete</span></strong><strong><span style="FONT-SIZE: 14pt">Q?/span></strong><br /><br />  malloc与free是C++/C语言的标准库函数Qnew/delete是C++的运符。它们都可用于申请动态内存和释放内存?br /><br />  对于非内部数据类型的对象而言Q光用maloc/free无法满动态对象的要求。对象在创徏的同时要自动执行构造函敎ͼ对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运符Q不在编译器控制权限之内Q不能够把执行构造函数和析构函数的Q务强加于malloc/free?br /><br />  因此C++语言需要一个能完成动态内存分配和初始化工作的q算WnewQ以及一个能完成清理与释攑ֆ存工作的q算Wdelete。注?new/delete不是库函数。我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见示??br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>class Obj<br />{<br /> public :<br />  Obj(void){ cout << “Initialization?<< endl; }<br />  ~Obj(void){ cout << “Destroy?<< endl; }<br />  void Initialize(void){ cout << “Initialization?<< endl; }<br />  void Destroy(void){ cout << “Destroy?<< endl; }<br />};<br />void UseMallocFree(void)<br />{<br /> Obj *a = (obj *)malloc(sizeof(obj)); // 甌动态内?br /> a->Initialize(); // 初始?br /> //?br /> a->Destroy(); // 清除工作<br /> free(a); // 释放内存<br />}<br />void UseNewDelete(void)<br />{<br /> Obj *a = new Obj; // 甌动态内存ƈ且初始化<br /> //?br /> delete a; // 清除q且释放内存<br />}<br />     CZ6 用malloc/free和new/delete如何实现对象的动态内存管?br /><br /></div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> <br />  cObj的函数Initialize模拟了构造函数的功能Q函数Destroy模拟了析构函数的功能。函数UseMallocFree中,׃ malloc/free不能执行构造函C析构函数Q必调用成员函数Initialize和Destroy来完成初始化与清除工作。函?UseNewDelete则简单得多?br /><br />  所以我们不要企囄malloc/free来完成动态对象的内存理Q应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过E,对它们而言malloc/free和new/delete是等L?br /><br />  既然new/delete的功能完全覆盖了malloc/freeQؓ什么C++不把malloc/free淘汰出局呢?q是因ؓC++E序l常要调用C函数Q而CE序只能用malloc/free理动态内存?/div> <div style="TEXT-INDENT: 21pt">如果用free释放“new创徏的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc甌的动态内存”,理论上讲E序不会出错Q但是该E序的可L很差。所以new/delete必须配对使用Qmalloc/free也一栗?/div> <img src ="http://m.shnenglu.com/yishanhante/aggbug/18957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-02-24 23:43 <a href="http://m.shnenglu.com/yishanhante/articles/18957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++内存理详解Q一Q?/title><link>http://m.shnenglu.com/yishanhante/articles/18953.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Sat, 24 Feb 2007 14:06:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/18953.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/18953.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/18953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/18953.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/18953.html</trackback:ping><description><![CDATA[ <div> <strong> <span style="FONT-SIZE: 14pt">1</span> </strong> <strong> <span style="FONT-SIZE: 14pt">、内存分配方?/span> </strong> </div> <div> <br />  内存分配方式有三U:<br />  Q?Q从静态存储区域分配。内存在E序~译的时候就已经分配好,q块内存在程序的整个q行期间都存在。例如全局变量Qstatic变量?br /><br />  Q?Q在栈上创徏。在执行函数Ӟ函数内局部变量的存储单元都可以在栈上创徏Q函数执行结束时q些存储单元自动被释放。栈内存分配q算内置于处理器的指令集中,效率很高Q但是分配的内存定w有限?br /><br />  Q?Q?从堆上分配,亦称动态内存分配。程序在q行的时候用malloc或new甌L多少的内存,E序员自p责在何时用free或delete释放内存。动态内存的生存期由我们军_Q用非常灵z,但问题也最多?br /><br /><strong><span style="FONT-SIZE: 14pt">2</span></strong><strong><span style="FONT-SIZE: 14pt">、常见的内存错误及其对策</span></strong></div> <div style="TEXT-INDENT: 21pt">发生内存错误是g非常ȝ的事情。编译器不能自动发现q些错误Q通常是在E序q行时才能捕捉到。而这些错误大多没有明昄症状Q时隐时玎ͼ增加了改错的隑ֺ。有时用h气冲冲地把你找来,E序却没有发生Q何问题,你一赎ͼ错误又发作了?常见的内存错误及其对{如下:<br /><br />  * 内存分配未成功,却用了它?br />  ~程新手常犯q种错误Q因Z们没有意识到内存分配会不成功。常用解军_法是Q在使用内存之前查指针是否ؓNULL。如果指针p是函数的参数Q那么在函数的入口处用assert(p!=NULL)q行<br /><br />  查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)q行防错处理?br /><br />  * 内存分配虽然成功Q但是尚未初始化引用它?br /><br />  犯这U错误主要有两个起因Q一是没有初始化的观念;二是误以为内存的~省初值全为零Q导致引用初值错误(例如数组Q。内存的~省初值究竟是什么ƈ没有l一的标准,管有些时候ؓ零|我们宁可信其无不可信其有。所以无论用何种方式创徏数组Q都别忘了赋初|即便是赋零g不可省略Q不要嫌ȝ?br /><br />  * 内存分配成功q且已经初始化,但操作越q了内存的边界?br /><br />  例如在用数l时l常发生下标“多1”或者“少1”的操作。特别是在for循环语句中,循环ơ数很容易搞错,D数组操作界?br /><br />  * 忘记了释攑ֆ存,造成内存泄露?br /><br />  含有q种错误的函数每被调用一ơ就丢失一块内存。刚开始时pȝ的内存充I你看不到错误。终有一ơ程序突然死掉,pȝ出现提示Q内存耗尽?br /><br />  动态内存的甌与释攑ֿ配对,E序中malloc与free的用次C定要相同Q否则肯定有错误Qnew/delete同理Q?br /><br />  * 释放了内存却l箋使用它?br /> <br />  有三U情况:<br /><br />  Q?Q程序中的对象调用关p过于复杂,实在难以搞清楚某个对象究竟是否已l释放了内存Q此时应该重新设计数据结构,从根本上解决对象理的؜乱局面?br /><br />  Q?Q函数的return语句写错了,注意不要q回指向“栈内存”的“指针”或者“引用”,因ؓ该内存在函数体结束时被自动销毁?br /><br />  Q?Q用free或delete释放了内存后Q没有将指针讄为NULL。导致生“野指针”?br /><br />  【规?】用malloc或new甌内存之后Q应该立x查指针值是否ؓNULL。防止用指针gؓNULL的内存?br /><br />  【规?】不要忘Cؓ数组和动态内存赋初倹{防止将未被初始化的内存作ؓ叛_g用?br /><br />  【规?】避免数l或指针的下标越界,特别要当心发生“多1”或者“少1”操作?br /><br />  【规?】动态内存的甌与释攑ֿ配对,防止内存泄漏?br /><br />  【规?】用free或delete释放了内存之后,立即指针设|ؓNULLQ防止生“野指针”?br /><br /><strong><span style="FONT-SIZE: 14pt">3</span></strong><strong><span style="FONT-SIZE: 14pt">、指针与数组的对?/span></strong><br /><br />  C++/CE序中,指针和数l在不少地方可以怺替换着用,让h产生一U错觉,以ؓ两者是{h的?br /><br />  数组要么在静态存储区被创建(如全局数组Q,要么在栈上被创徏。数l名对应着Q而不是指向)一块内存,其地址与容量在生命期内保持不变Q只有数l的内容可以改变?br /><br />  指针可以随时指向Lcd的内存块Q它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数l灵z,但也更危险?br /><br />  下面以字W串Z比较指针与数l的Ҏ?br /><br />  <strong>3.1 </strong><strong>修改内容</strong><br /><br />  CZ3-1中,字符数组a的容量是6个字W,其内容ؓhello。a的内容可以改变,如a[0]= ‘X’。指针p指向帔R字符东yworld”(位于静态存储区Q内容ؓworldQ,帔R字符串的内容是不可以被修改的。从语法上看Q编译器q不觉得语句 p[0]= ‘X’有什么不妥,但是该语句企图修改常量字W串的内容而导致运行错误?/div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e0e0e0; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>char a[] = “hello?<br />a[0] = ‘X?<br />cout << a << endl;<br />char *p = “world? // 注意p指向帔R字符?br />p[0] = ‘X? // ~译器不能发现该错误<br />cout << p << endl;<br />      CZ3.1 修改数组和指针的内容</div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> </div> <div style="TEXT-INDENT: 21pt">  <strong>3.2 </strong><strong>内容复制与比?/strong><br /><br />  不能Ҏl名q行直接复制与比较。示?-3-2中,若想把数la的内容复制给数组bQ不能用语句 b = a Q否则将产生~译错误。应该用标准库函数strcpyq行复制。同理,比较b和a的内Ҏ否相同,不能用if(b==a) 来判断,应该用标准库函数strcmpq行比较?br /><br />  语句p = a q不能把a的内容复制指针pQ而是把a的地址赋给了p。要惛_制a的内容,可以先用库函数malloc为p甌一块容量ؓstrlen(a)+1个字W的内存Q再用strcpyq行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址Q应该用库函数strcmp来比较?/div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e0e0e0; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div> <br />// 数组?br />char a[] = "hello";<br />char b[10];<br />strcpy(b, a); // 不能?b = a;<br />if(strcmp(b, a) == 0) // 不能?if (b == a)<br />?br />// 指针?br />int len = strlen(a);<br />char *p = (char *)malloc(sizeof(char)*(len+1));<br />strcpy(p,a); // 不要?p = a;<br />if(strcmp(p, a) == 0) // 不要?if (p == a)<br />?br />       CZ3.2 数组和指针的内容复制与比?/div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> </div> <div> <strong>3.3 </strong> <strong>计算内存定w</strong> <br /> <br />  用运符sizeof可以计算出数l的定wQ字节数Q?/div> <div>CZ7-3-3QaQ中Qsizeof(a)的值是12Q注意别忘了’’)。指针p指向aQ但?sizeof(p)的值却?。这是因为sizeof(p)得到的是一个指针变量的字节敎ͼ相当于sizeof(char*)Q而不是p所指的内存定w?C++/C语言没有办法知道指针所指的内存定wQ除非在甌内存时记住它? <div style="TEXT-INDENT: 21pt">注意当数l作为函数的参数q行传递时Q该数组自动退化ؓ同类型的指针?/div><div style="TEXT-INDENT: 21pt">CZ7-3-3QbQ中Q不论数la的容量是多少Qsizeof(a)始终{于sizeof(char *)?br /><br /></div><table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e0e0e0; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"><tbody><tr><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"><div>char a[] = "hello world";<br />char *p = a;<br />cout<< sizeof(a) << endl; // 12字节<br />cout<< sizeof(p) << endl; // 4字节<br />     CZ3.3QaQ?计算数组和指针的内存定w</div></td></tr></tbody></table><div style="TEXT-INDENT: 21pt"> </div><table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e0e0e0; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"><tbody><tr><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"><div>void Func(char a[100])<br />{<br /> cout<< sizeof(a) << endl; // 4字节而不?00字节<br />}<br />     CZ3.3QbQ?数组退化ؓ指针</div><div> </div></td></tr></tbody></table></div> <img src ="http://m.shnenglu.com/yishanhante/aggbug/18953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-02-24 22:06 <a href="http://m.shnenglu.com/yishanhante/articles/18953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.santai58.cn" target="_blank">þþƷ޾Ʒ</a>| <a href="http://www.szebase.com.cn" target="_blank">պŷۺϾþӰԺd3</a>| <a href="http://www.sank.net.cn" target="_blank">ƷȾþëƬ</a>| <a href="http://www.gcjszzbjb.cn" target="_blank">ŮдþӰԺ</a>| <a href="http://www.mutian100.cn" target="_blank">޹˾Ʒ91þþ</a>| <a href="http://www.madouwang.cn" target="_blank">˳þõӰվ</a>| <a href="http://www.desktx.cn" target="_blank">þ99ֻоƷ</a>| <a href="http://www.nokia-flash.cn" target="_blank">þþþþþ97</a>| <a href="http://www.d13722.cn" target="_blank">޳ɫwwwþվҹ</a>| <a href="http://www.dogff.cn" target="_blank">þù޾Ʒ鶹</a>| <a href="http://www.chuikua.cn" target="_blank">þþþ뾫Ʒ</a>| <a href="http://www.76288.com.cn" target="_blank">ھƷþ </a>| <a href="http://www.ikdianying.cn" target="_blank">þþƷۺɫ</a>| <a href="http://www.sbsinc.com.cn" target="_blank">ȾþùƷ</a>| <a href="http://www.021cp.cn" target="_blank">һɫþHEZYO</a>| <a href="http://www.kangle.net.cn" target="_blank">996þùƷ߹ۿ</a>| <a href="http://www.gcjszzbjb.cn" target="_blank">һƷ˾þ</a>| <a href="http://www.chemzt.cn" target="_blank">þþƷ</a>| <a href="http://www.qvcz.cn" target="_blank">þþù99þùһ</a>| <a href="http://www.dpww.net.cn" target="_blank">þˬˬ</a>| <a href="http://www.nanling888.cn" target="_blank">wwwþ</a>| <a href="http://www.liuxuehanguo.cn" target="_blank">þAV</a>| <a href="http://www.sywanfu.cn" target="_blank">þþþþüƷþþ</a>| <a href="http://www.ghbo.cn" target="_blank">ƷҹþøƬ</a>| <a href="http://www.buksk.cn" target="_blank">AVҰ¾þ</a>| <a href="http://www.hkzkzs.com.cn" target="_blank">þþþþþþþѾƷ</a>| <a href="http://www.ed34.cn" target="_blank">þþƷAAƬһ</a>| <a href="http://www.qilehu.cn" target="_blank">þþƷƷëƬ</a>| <a href="http://www.haosim.cn" target="_blank">˾þþƷ</a>| <a href="http://www.zyhyhz.cn" target="_blank">ٸ߳ҽоþþþþ</a>| <a href="http://www.jinhangroup.cn" target="_blank">˾þһ</a>| <a href="http://www.0553fc.cn" target="_blank">ƷþþӰ㽶</a>| <a href="http://www.aofa-dsj.cn" target="_blank">91Ʒþþþþ</a>| <a href="http://www.dyba2008.cn" target="_blank">ƷŮٸAVѾþ</a>| <a href="http://www.jupucha.com.cn" target="_blank">ɫþˬˬƬaV</a>| <a href="http://www.glhu.cn" target="_blank">þҹƵ</a>| <a href="http://www.geekon.com.cn" target="_blank">þþþþþþþѾƷ</a>| <a href="http://www.qdtiandiyuan.cn" target="_blank">ھƷþþþav</a>| <a href="http://www.jxjkyt.cn" target="_blank">þþƷAVһ</a>| <a href="http://www.flycard.com.cn" target="_blank">ŷƷһƷþ</a>| <a href="http://www.bagscheap.cn" target="_blank">ó˾þAvѸ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>