﻿<?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++博客-happem</title><link>http://www.cppblog.com/happem/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 04:10:57 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 04:10:57 GMT</pubDate><ttl>60</ttl><item><title>什么是函数链接规范</title><link>http://www.cppblog.com/happem/archive/2012/09/26/192044.html</link><dc:creator>happem</dc:creator><author>happem</author><pubDate>Wed, 26 Sep 2012 02:32:00 GMT</pubDate><guid>http://www.cppblog.com/happem/archive/2012/09/26/192044.html</guid><wfw:comment>http://www.cppblog.com/happem/comments/192044.html</wfw:comment><comments>http://www.cppblog.com/happem/archive/2012/09/26/192044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/happem/comments/commentRss/192044.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/happem/services/trackbacks/192044.html</trackback:ping><description><![CDATA[<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">在使用不同编程语言进行软件联合开发的时候，需要统一函数、变量、数据类型、常量等链接规范，特别是在不同模块之间共享的接口部分，当开发程序库的时候，明确链接规范也是必须遵循的一条规则。</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">对COM接口及其使用的数据类型来说，是否采用统一的链接规范，对其二进制兼容性和可移植性都没有影响。因为连接规范主要影响到名字改编方案的不同，这样即使接口两端对接口本身的解释不通，只要它们使用一致的成员对齐方式和布局方案、一致的函数调用规范、一致virtual&nbsp;function实现方式，总是就是一致的C++对象模型。并且保证COM组件升级时不改变原来的接口和数据类型定义，则所有方法的运行时绑定都不会存在问题（所有方法的调试都被转换为通过对象指针对vptr和vtable及函数指针的操作，这种间接性不再需要任何方法名即函数名的参与，而接口名和方法名只是为了让客户端的代码能够顺利通过编译，但是连接时就完全不在需要了。）</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">但是对于定义于普通静态链接库和动态链接库中的全局数据类型、全局函数、全局变量甚至全局常量，它们的连接规范必须在两端保持一致、否则客户程序会出现连接问题。这是因为普通的封装为DLL的函数库或者类库，客户程序在创建使一般都需要与它们的导出库进行连接，除非使用loadlibrary()和getprocaddress()函数对来获得DLL中函数的地址，通用的连接规范要属C连接规范：extern&#8216;C&#8217;。</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">具体使用方法，</span><span><a href="http://www.lirenedu.org/"><span style="font-family: '宋体'; color: rgb(0,0,255); font-size: 10.5pt; font-weight: normal; text-decoration: underline; mso-spacerun: 'yes'">里仁教育嵌入式培训</span></a></span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">职业讲师详情讲解：</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">Extern&#8217;C&#8217;void&nbsp;WinMainCRTStartup()；</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">Extern&#8217;C&#8217;const&nbsp;CLSID&nbsp;CLSID_DataConvert()；</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">Extern&#8217;C&#8217;struct&nbsp;Student{.......}；</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">Extern&#8217;C&#8217;student&nbsp;g_student;</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">如果是对一段代码指定连接规范：</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">#ifdef&nbsp;&nbsp;_cplusplus</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">Extern&nbsp;&#8216;C&#8217;{</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">#endif</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">Const&nbsp;int&nbsp;MAX_AGE=200；</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">#pragma&nbsp;pack(push,4)</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">Typedef&nbsp;struct&nbsp;_person</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">{</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;Char&nbsp;*m_Name;</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;Int&nbsp;m_Age;</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">}person,*personPtr;</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">#pragma&nbsp;pack(pop)</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">Person&nbsp;g_Me;</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;Int&nbsp;_cdecl&nbsp;memcmp(const&nbsp;void*,const&nbsp;void*,size_t)；</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;Void&nbsp;*&nbsp;_cdecl&nbsp;memcpy(void,const&nbsp;void*,size_t)；</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;Void*&nbsp;_cdecl&nbsp;memset(void*,int,size_t)；</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">#ifdef&nbsp;_cplusplus</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">}</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">#endif</span><span style="font-family: 'Arial'; font-size: 9pt; mso-spacerun: 'yes'"><O:P></O:P></span></p><br />嵌入式行业资讯：全套基础：<a href="http://www.lirenedu.org/index.php?ack=lanmu&amp;id=82">http://www.lirenedu.org/index.php?ack=lanmu&amp;id=82</a>&nbsp;<img src ="http://www.cppblog.com/happem/aggbug/192044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/happem/" target="_blank">happem</a> 2012-09-26 10:32 <a href="http://www.cppblog.com/happem/archive/2012/09/26/192044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何消灭进程</title><link>http://www.cppblog.com/happem/archive/2012/09/18/191079.html</link><dc:creator>happem</dc:creator><author>happem</author><pubDate>Tue, 18 Sep 2012 02:23:00 GMT</pubDate><guid>http://www.cppblog.com/happem/archive/2012/09/18/191079.html</guid><wfw:comment>http://www.cppblog.com/happem/comments/191079.html</wfw:comment><comments>http://www.cppblog.com/happem/archive/2012/09/18/191079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/happem/comments/commentRss/191079.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/happem/services/trackbacks/191079.html</trackback:ping><description><![CDATA[<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">有些进程在运行时会占用大量的CPU，有些进程会导致X死掉，有些进程会吞噬掉大量的内存，这些进程直接影响了用户的正常工作，最直接的现象就是系统运行缓慢，死机等现象，处理这些进程一般的方法就是结束这个进程，就是所说的把它KILL掉。下面介绍几种消灭进程的方法。</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">使用Kill命令来消灭进程</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;如果运行了某个程序导致了死机，那么就应该切换到其他的控制台下，按下ctrl+alt+fx，其中x可以是1&#183;5，这取决于用户的try的多少。</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;用ps显示这个程序的进程ID。</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">这里以xchat为例。</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;$ps&nbsp;aux&nbsp;|grep&nbsp;xchat</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;Wanglin&nbsp;12063&nbsp;0.0&nbsp;1.8&nbsp;89536&nbsp;19028&nbsp;?S1&nbsp;apr06&nbsp;2:40&nbsp;xchat</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;其中12063就是它的ID。</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;也可以使用pgrep来显示ID，如下：</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;$pgrep&nbsp;xchar&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;12063</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;使用Kill来消灭这个进程</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;使用kil来消灭进程，如果消灭不掉，还要加参数-9，它可以强制结束进程。</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;$&nbsp;kill&nbsp;12063</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;$&nbsp;kill&nbsp;-9&nbsp;12063</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">使用pkill或者killall来消灭进程</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;它们的共同点就是都可以用程序的名称作为参数。</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;$&nbsp;pkill&nbsp;-9&nbsp;xchat</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;$&nbsp;killall&nbsp;xchat</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">使用图形化的方式来消灭进程</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;$xkill</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">会出现一个X形的光标，单击需要消灭的窗口，就可以消灭这个程序。<a href="http://www.lirenedu.org">www.lirenedu.org</a> </span></p><!--EndFragment--><img src ="http://www.cppblog.com/happem/aggbug/191079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/happem/" target="_blank">happem</a> 2012-09-18 10:23 <a href="http://www.cppblog.com/happem/archive/2012/09/18/191079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何给用户的文件打补丁</title><link>http://www.cppblog.com/happem/archive/2012/09/18/191078.html</link><dc:creator>happem</dc:creator><author>happem</author><pubDate>Tue, 18 Sep 2012 02:23:00 GMT</pubDate><guid>http://www.cppblog.com/happem/archive/2012/09/18/191078.html</guid><wfw:comment>http://www.cppblog.com/happem/comments/191078.html</wfw:comment><comments>http://www.cppblog.com/happem/archive/2012/09/18/191078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/happem/comments/commentRss/191078.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/happem/services/trackbacks/191078.html</trackback:ping><description><![CDATA[<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Patch的主要用途就是更新源代码到新的版本，避免下载整个源代码，下载一个有效的补丁仅仅需要下载发生变化的那些代码行就可以了，patch的帮助文档中罗列了众多的用法，其实大多数的时间只要下面两个命令参数就能满足大家的需要。下面讲解patch的用法，以Ubuntu7.10系统为例。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">&nbsp;1.&nbsp;命令格式</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;#patch&nbsp;-p1&lt;[patchfile]</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;或者</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">#patch&nbsp;-R&nbsp;&lt;[patchfile]</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">上面两个格式任选一条就可以了。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">2.</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">使用方法</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;#patch&nbsp;-p1&lt;[patchfile]</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">要求补丁文件要放到源代码目录下，然后在运行这条命令。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">例如：给xchat2.6.0打补丁，&nbsp;补丁文件是xc260-fetext.diff。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">首先选入&nbsp;xchat2.6.0的目录，&nbsp;并且将xc260-fix-fetext.diff文件复制到这个目录，然后运行：</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;#patch&nbsp;-p1&lt;xc260-fix-fetext.diff</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">如果出现提示信息：patching&nbsp;file&nbsp;src/text/fe-text/fe-text.c&nbsp;这说明打补丁成功了。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;#patch&nbsp;-R&lt;[pathfile]</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">这个命令运行后，还要指定被补丁的文件的路径和文件名.www.lirenedu.org </span></p><!--EndFragment--><img src ="http://www.cppblog.com/happem/aggbug/191078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/happem/" target="_blank">happem</a> 2012-09-18 10:23 <a href="http://www.cppblog.com/happem/archive/2012/09/18/191078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu系统下：如何快速配置网络</title><link>http://www.cppblog.com/happem/archive/2012/09/12/190394.html</link><dc:creator>happem</dc:creator><author>happem</author><pubDate>Wed, 12 Sep 2012 06:57:00 GMT</pubDate><guid>http://www.cppblog.com/happem/archive/2012/09/12/190394.html</guid><wfw:comment>http://www.cppblog.com/happem/comments/190394.html</wfw:comment><comments>http://www.cppblog.com/happem/archive/2012/09/12/190394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/happem/comments/commentRss/190394.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/happem/services/trackbacks/190394.html</trackback:ping><description><![CDATA[<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">在Ubuntu系统下工作，只掌握图形化的配置工具还是不够的，系统在出现故障的时候往往使用的是终端的操作模式，下面里仁3G培训讲师介绍在终端下如何配置网络。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">临时改变网络参数</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">.Ifconfig:查看和配置IP地址。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$ifconfig&nbsp;eth0</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$sudo&nbsp;ifconfig&nbsp;eth0&nbsp;192.168.9.23&nbsp;netmask&nbsp;255.255.255.0</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">route:配置路由参数</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$sudo&nbsp;route&nbsp;add&nbsp;default&nbsp;gw&nbsp;192.168.9.1&nbsp;eth0&nbsp;#设置默认网关</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">使参数立即生效</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$sudo/etc/init.d/networking&nbsp;restart</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">修改网络配置文件</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">设置DNS服务器。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$sudo&nbsp;echo&#8216;nameserver=219.150.32.132&gt;/etc/resolv.conf&#8217;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">编辑/etc/network/interfaces。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$sudo&nbsp;vim&nbsp;/etc/network/interfaces</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Auto&nbsp;lo</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Iface&nbsp;lo&nbsp;inet&nbsp;loopback</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;Iface&nbsp;eth0&nbsp;inet&nbsp;static&nbsp;&nbsp;&nbsp;#设置eth0,静态IP</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;Address&nbsp;192.168.8.45</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Netmask&nbsp;255.255.255.0</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Gateway&nbsp;192.168.8.1</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Iface&nbsp;eht1inet&nbsp;dhcp&nbsp;#设置eth1为dhcp模式</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">可以通过下面的命令设置路由。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Up&nbsp;route&nbsp;add&nbsp;default&nbsp;gw&nbsp;192.168.8.1&nbsp;eth1</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Up&nbsp;route&nbsp;add&nbsp;&#8211;net&nbsp;192.168.8.0/24&nbsp;gw&nbsp;192.168.8.1&nbsp;eth0</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Down&nbsp;route&nbsp;del&nbsp;&#8211;net&nbsp;192.168.8.0/24&nbsp;gw&nbsp;192.168.8.1&nbsp;eth0</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">其中，当网络接口up时，执行它后面的命令；当网络接口down时，执行它后面的命令。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">使用参数立即生效。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$sudo&nbsp;/etc/init.d/networking&nbsp;restart<font face="Verdana"> 转：<a href="http://www.lirenedu.org">www.lirenedu.org</a> </font></span></p><!--EndFragment--><img src ="http://www.cppblog.com/happem/aggbug/190394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/happem/" target="_blank">happem</a> 2012-09-12 14:57 <a href="http://www.cppblog.com/happem/archive/2012/09/12/190394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>系统信息命令使用技巧</title><link>http://www.cppblog.com/happem/archive/2012/09/12/190393.html</link><dc:creator>happem</dc:creator><author>happem</author><pubDate>Wed, 12 Sep 2012 06:55:00 GMT</pubDate><guid>http://www.cppblog.com/happem/archive/2012/09/12/190393.html</guid><wfw:comment>http://www.cppblog.com/happem/comments/190393.html</wfw:comment><comments>http://www.cppblog.com/happem/archive/2012/09/12/190393.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/happem/comments/commentRss/190393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/happem/services/trackbacks/190393.html</trackback:ping><description><![CDATA[<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">许多学员都使用</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">linux</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">来完成各种工作，包括学习、办公、编程、网络维护等，但对所使用系统的一些基本信息知了甚少，有的连自己显卡的型号、</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">CPU</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的具体型号、硬盘的使用情况、内存的使用情况网络的使用情况都不清楚，一旦系统出现故障，就无从下手，所以在此里仁</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">3G</span><span><a href="http://www.lirenedu.org/index.php?ack=lanmu&amp;id=19"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><font color="#7b7c80">嵌入式培训</font></span></a></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">讲师有必要给大家介绍如何准确地获得自己的系统信息。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21.25pt; margin-bottom: 0pt; margin-left: 21.25pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">1.&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">系统信息</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">查看内核信息。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$uname&nbsp;-a</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">查看操作系统的版本。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$head&nbsp;<font face="宋体">&#8211;</font><font face="Times New Roman">n&nbsp;1/etc/issue</font></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">查看</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">CPU</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的信息。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$cat&nbsp;/proc/cpuinfo</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">查看计算机名称。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$hostname</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">列出所有</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">PCI</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">设备信息。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$lspci&nbsp;<font face="宋体">&#8211;</font><font face="Times New Roman">tv</font></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">列出所有</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">USB</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">设备信息。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$lsusb&nbsp;<font face="宋体">&#8211;</font><font face="Times New Roman">tv</font></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">列出系统加载的模块信息。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$lsmod</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21.25pt; margin-bottom: 0pt; margin-left: 21.25pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">2.&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">系统资源的使用信息。</span><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">查看内存和交换区分的使用量。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$free&nbsp;<font face="宋体">&#8211;</font><font face="Times New Roman">m</font></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">查看硬盘分区的使用情况。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$df&nbsp;<font face="宋体">&#8211;</font><font face="Times New Roman">h</font></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">查看某个目录的大小。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$du&nbsp;<font face="宋体">&#8211;</font><font face="Times New Roman">sh&lt;</font></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">目录</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">查看内存总量和空闲内存量。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$grep&nbsp;memTotal&nbsp;/proc/meminfo</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$grep&nbsp;memfree&nbsp;/proc/meminfo</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">查看系统运行时间、用户数和负载。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$uptime</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 21pt" class="p0"><span style="font-family: 'Wingdings'; font-size: 10.5pt; mso-spacerun: 'yes'">l&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">查看系统负载。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">$cat&nbsp;/proc/loadavg <a href="http://www.lirenedu.org">www.lirenedu.org</a> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p><!--EndFragment--><img src ="http://www.cppblog.com/happem/aggbug/190393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/happem/" target="_blank">happem</a> 2012-09-12 14:55 <a href="http://www.cppblog.com/happem/archive/2012/09/12/190393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为什么需要构造函数和析构函数</title><link>http://www.cppblog.com/happem/archive/2012/09/03/189235.html</link><dc:creator>happem</dc:creator><author>happem</author><pubDate>Mon, 03 Sep 2012 02:56:00 GMT</pubDate><guid>http://www.cppblog.com/happem/archive/2012/09/03/189235.html</guid><wfw:comment>http://www.cppblog.com/happem/comments/189235.html</wfw:comment><comments>http://www.cppblog.com/happem/archive/2012/09/03/189235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/happem/comments/commentRss/189235.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/happem/services/trackbacks/189235.html</trackback:ping><description><![CDATA[<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">编译器无法预期一个程序在执行过程中会在何时创建一些什么对象，而只能根据当时的上下文要求创建，对象的初始化最好能够通过运行时执行一个函数来完成，而且是在对象创建的同时，这个函数就是构造函数，同样，对象在完成其使命的时候能够通过一个函数来销毁，这就是析构函数。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">当给一个对象分配好原始内存空间的时候，这个对象就应该算创建起来了。只不过它还处于一种&#8220;原始状态&#8221;，即末初始化的，不良的状态，如果把这样的内存直接拿来使用，除非第一个操作是赋值，否则极有可能出错。例如：</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Long&nbsp;long1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//局部变量</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Count&lt;<lng1<<endl;&nbsp;&nbsp; span 访问原始内存<><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Char*pstr=(char*)malloc(1024);</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Cout&lt;<pstr<<endl;&nbsp;&nbsp;&nbsp; span 访问末初始化内存<><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">因此，创建一个变量或动态对象时一定不要忘记初始化。&nbsp;初始化就是在对象创建的同时使用初值直接填充对象的内存单元，因此，不会有数据类型转换等中间过程，也就不会产生临时对象，而赋值则是在对象创建好后任何时候都可以调用的而且可以多次调用的函数，由于它调用的是&#8220;=&#8221;运算符，因此可能需要进行类型转换，即会产生临时对象。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">C++对象可以使用构造函数来初始化，构造函数是任何对象创建时自动调用的第一个成员函数，也是为每个对象仅调用一次的成员函数，所以构造函数的作用就是：</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">当对象的内存分配好后把它原始状态变成良好的可用的状态。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">有的程序员可能认为：虽然我没有在构造函数中初始化数据成员，但是我在声明一个对象后马上调用它的set-XXX()函数来初始化它的每一个成员，效果也是一样的。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">最好为每个类显式地定义构造函数和析构函数，即使它们暂时空着，尤其是当类含有指针成员或引用成员的时候。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">构造函数的另一重要用途就是给一些可能可能存在的隐含成员如vptr创造一个初始化的机会，否则虚拟机将不能保证实现，每当此时，如果程序员没有为一个多态类显式地定义默认构造函数、拷贝构造函数、析构函数或拷贝赋值函数，那么编译器会自动得生成相应的函数，它们都是public&nbsp;inline的，并在其中插入正确初始化或修改vptr数据成员值的代码，而且确保基类对象和派生类对象构造时及在它们之间拷贝时vptr能够指向或重新指向恰当的vtable，这样的4个函数分布叫非平凡默认构造函数、非平凡拷贝构造函数、非平凡析构函数和非平凡拷贝赋值函数。<a href="http://www.lirenedu.org">www.lirenedu.org</a></span></p><!--EndFragment--></span></span><img src ="http://www.cppblog.com/happem/aggbug/189235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/happem/" target="_blank">happem</a> 2012-09-03 10:56 <a href="http://www.cppblog.com/happem/archive/2012/09/03/189235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C基础下的函数调用技巧</title><link>http://www.cppblog.com/happem/archive/2012/09/03/189234.html</link><dc:creator>happem</dc:creator><author>happem</author><pubDate>Mon, 03 Sep 2012 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/happem/archive/2012/09/03/189234.html</guid><wfw:comment>http://www.cppblog.com/happem/comments/189234.html</wfw:comment><comments>http://www.cppblog.com/happem/archive/2012/09/03/189234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/happem/comments/commentRss/189234.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/happem/services/trackbacks/189234.html</trackback:ping><description><![CDATA[<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">与函数堆栈使用密切相关的就是函数调用规范，即调用约定(Calling&nbsp;Convenion)。函数调用规范决定了函数调用的实参压栈、退栈及堆栈释放的方式以及函数名改编的方案，windows环境下常用的调用规范有：</span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 10.5pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 26.2pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">1)</span><span style="font-style: normal; font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">_cedcl:</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">这是C++/C函数的默认调用规范</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，参数从右向左传递压入堆栈，由调用函数复杂堆栈的清退，因此这种方式利于传递个数可变的参数给被调用函数。如printf()就是这样的函数。</span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 26.2pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">2)</span><span style="font-style: normal; font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">_stdcall:</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">这是Win&nbsp;API函数使用的调用规范，</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">参数从右向左依次传递并压入堆栈，由被调用函数复杂堆栈的清退。该规范生成的函数代码比_cdecl更小，但当函数有可变个数的参数时会转为_cdecl规范。在Windows中，宏WINAPI、CALLBACK都定义为_stdcall。</span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 26.2pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">3)</span><span style="font-style: normal; font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">_thiscall:</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">是C++非静态成员函数的默认调用规范</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，不能使用个数可变的参数。当调用非静态成员函数的时候，this指针直接保存在ECX寄存器中而压入函数堆栈，其他方面与_stdcall相同。</span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 26.2pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">4)</span><span style="font-style: normal; font-family: '宋体'; font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">_fastcall:</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">该规范所修饰的函数的实参将被直接传递到CPU寄存器中而不是内存堆栈中，堆栈清退由被调用函数负责，该规范不能用于成员函数。</span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 26.2pt" class="p0"><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 5.2pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">函数必须制定的一个调用规范，特别是在模块之间的逻辑接口中，每个函数原型的调用规范必须与其实的调用规范保持一致，否则会出现编译连接错误。如果你调用了在某个DLL中实现的COM对象的方法，而这些方法在创建时却没显式地制定调用规范，那么它们会使用环境默认的调用规范，虽然你的程序可以通过编译和连接，但是在运行时就可能导致程序崩溃。</span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 5.2pt" class="p0"><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 5.2pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">所以，凡是接口函数都必须显式地制定其调用规范，除非接口函数是类的非静态成员函数，如果不显式制定调用规范，类的静态成员函数和全局函数将采用C++/C默认的函数调用规范或者由工程设置指定的调用规范，因此最好也为静态成员函数显式地指定调用规范。</span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 5.2pt" class="p0"><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">注意：类的静态成员函数的默认调用规范不是thiscall，类的友元函数的调用也不是thiscall，它们都是由函数本身指定或者由工程设定的。COM接口的方法都指定_stdcall调用规范，而我们自己开发COM对象及接口时也可以指定其他的调用规范。</span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 10.5pt; margin-bottom: 0pt; margin-left: 5.25pt" class="p0"><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 5.2pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">一定要知道C基础的基本概念：</span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 5.2pt" class="p0"><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 5.2pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">认识函数堆栈：</span><span><a href="http://www.lirenedu.org/index.php?ack=xinwen&amp;id=1026"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; text-decoration: underline; mso-spacerun: 'yes'">http://www.lirenedu.org/index.php?ack=xinwen&amp;id=1026</span></a></span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 5.2pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">基于C语言基础概念：</span><span><a href="http://www.lirenedu.org/index.php?ack=xinwen&amp;id=1024"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; text-decoration: underline; mso-spacerun: 'yes'">http://www.lirenedu.org/index.php?ack=xinwen&amp;id=1024</span></a></span><span style="font-family: 'Arial'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">操作系统几个基本要点：</span><span><a href="http://www.lirenedu.org/index.php?ack=xinwen&amp;id=1029"><span style="font-family: '宋体'; font-size: 10.5pt; font-weight: bold; text-decoration: underline; mso-spacerun: 'yes'">http://www.lirenedu.org/index.php?ack=xinwen&amp;id=1029</span></a></span></p><!--EndFragment--><img src ="http://www.cppblog.com/happem/aggbug/189234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/happem/" target="_blank">happem</a> 2012-09-03 10:55 <a href="http://www.cppblog.com/happem/archive/2012/09/03/189234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL容器元素数据满足哪些条件</title><link>http://www.cppblog.com/happem/archive/2012/08/27/188415.html</link><dc:creator>happem</dc:creator><author>happem</author><pubDate>Mon, 27 Aug 2012 06:03:00 GMT</pubDate><guid>http://www.cppblog.com/happem/archive/2012/08/27/188415.html</guid><wfw:comment>http://www.cppblog.com/happem/comments/188415.html</wfw:comment><comments>http://www.cppblog.com/happem/archive/2012/08/27/188415.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/happem/comments/commentRss/188415.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/happem/services/trackbacks/188415.html</trackback:ping><description><![CDATA[<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">一、</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">可默认构造的，也即具有</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">public</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">default&nbsp;constructor</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，不论是用户显式定义还是编译器默认的，但是用户定义的带参数</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">constructor</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">会仰制编译器合成</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">default&nbsp;constructor</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，实际上并非任何情况下任意一种容器要求其元素类型满足这一条件，特别是关联式容器，因为只有序列式容器的某些函数才可能明确地或隐含地使用元素类型的</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">default&nbsp;constructor</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，如果你不调用这样的成员函数，编译器就不需要元素类型的默认构造函数。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">二、</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">可拷贝构造和拷贝赋值的，既具有</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">public</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">copy&nbsp;constructor</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">和</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">copy&nbsp;assignment&nbsp;operator</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，不论是编译器默认还是</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">operator</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，如果没有显式定义它的话，这个条件可归结为：</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">元素必须是拷贝的，但实际上拷贝赋值的要求也不是强制的，原因和</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">default&nbsp;constructor</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">类似。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">三、</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">具有</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">public</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">destructor</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，不论是编译器默认的还是用户显式定义的。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">四、</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">对于关联式容器，要求其元素必须是可比较的。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Auto_ptr</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">满足上述条件吗？至少满足前三条，因此至少可以作为序列式容器的元素，如果为</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">auto-ptr</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">定义了比较运算符的话，应该还可以把它作为关联式容器的元素。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">但是</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">auto_ptr</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的特点是接管和转移拥有权，而不是像原始指针那样可以共享实值对象，即</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">auto_ptr</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">在初始化时接管实值对象和拥有权，而在拷贝时会交出实值对象及其拥有权。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">因此，</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">auto_ptr</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">对象和它的拷贝不会共享实值它的拷贝并不相同，然而根据</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">STL</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">容器值语义的要求，可拷贝构造意味着一个着把一个对象赋值给另一个同类型对象将产生两个相同的对象，显然，</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">auto_ptr</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">不能满足这一要求，与上面结论矛盾！那么问题出在哪里呢？</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">在揭开</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">auto_ptr</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">的之前需要了解</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">copy&nbsp;constructor</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">和</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">copy&nbsp;assignment&nbsp;operator</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">，的几种合法形式，任何一个类都允许两种形式的</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">copy&nbsp;constructor</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">：</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;C(const&nbsp;C&#169;)</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">；</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;C</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">（</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">C&#169;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">）；</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">同样，</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">copy&nbsp;assignment&nbsp;operator</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">允许类似的两种形式。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;C&amp;&nbsp;operator=</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">（</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">const&nbsp;C&nbsp;&#169;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">）；</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;C&amp;&nbsp;operator=</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">（</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">C&nbsp;&amp;&nbsp;copy</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">）；</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">实际上，由于</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">copy&nbsp;assignment&nbsp;operator</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">为普通的运算符重载成员函数，因此还可以定义下列形式赋值函数；</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;C&amp;operator=</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">（</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">C&nbsp;copy</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">）；</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">如果要防止用户把一些不合适的对象放入容器中，就要求对象的设计和是实现者使用一些语言支持但不常用的特征，也就是说，要能够在编译阶段就阻止这种具有潜在危险性的行为，常用的方法就是迫使其违反</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">C++</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">静态类型安全规则。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>源处：<a href="http://www.lirenedu.org/index.php?ack=xinwen&amp;id=1178">http://www.lirenedu.org/index.php?ack=xinwen&amp;id=1178</a>&nbsp;<br /><img src ="http://www.cppblog.com/happem/aggbug/188415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/happem/" target="_blank">happem</a> 2012-08-27 14:03 <a href="http://www.cppblog.com/happem/archive/2012/08/27/188415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>异常处理的原理</title><link>http://www.cppblog.com/happem/archive/2012/08/23/188043.html</link><dc:creator>happem</dc:creator><author>happem</author><pubDate>Thu, 23 Aug 2012 06:39:00 GMT</pubDate><guid>http://www.cppblog.com/happem/archive/2012/08/23/188043.html</guid><wfw:comment>http://www.cppblog.com/happem/comments/188043.html</wfw:comment><comments>http://www.cppblog.com/happem/archive/2012/08/23/188043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/happem/comments/commentRss/188043.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/happem/services/trackbacks/188043.html</trackback:ping><description><![CDATA[<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">传统的错误处理是用不同的数值来表示不同类型的错误，其表达能力很有限，因为一个数字包含的信息量太少，而</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">C++</span><span><a href="http://www.lirenedu.org/index.php?ack=xinwen&amp;id=1162"><span style="font-family: '宋体'; color: rgb(0,0,255); font-size: 10.5pt; text-decoration: underline; mso-spacerun: 'yes'">异常处理机制</span></a></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">将异常类型化，显然一个类型要比一个数字包含的信息量大得多。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">比如我们常用的函数</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">fopen(),</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">当打开文件失败是返回</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">NULL</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，按照传统的错误处理方法，在调用</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Fopen()</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">后立即检查其返回值，如果为</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">NULL</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">就进行错误处理，如果将返回</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">NULL</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">改为抛出异常</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">OpenFailed</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，那么我们就不用在调用</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">fopen()</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">后马上检查返回值，而是在调用函数内部或者更高层的调用者那里设置异常处理器来捕获这个异常，</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">C++</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">保证：如果一个异常在抛出点没有得到处理，那么它将一直抛向上层调用者，直至</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">main()</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">函数，直到找到一个类型匹配的异常处理器，否则调用</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">terminate()</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">结束程序。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">可以看出：</span><span style="font-family: '宋体'; color: rgb(255,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">异常处理机制实际上是一种运行时通知机制。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;Class&nbsp;DevidedByZero{}</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">；</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;Double&nbsp;Devide</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">（</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">double&nbsp;a</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">double&nbsp;b</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">）</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;{</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21.75pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">If</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">（</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">abs(b)<std< span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">：：</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">numeric_limits<double></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">：：</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">epsilon()</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">）</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21.75pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;{</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;Throw&nbsp;DevidedByZero()</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">；</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">//</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">提前检测异常发生条件并抛出自定义异常</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;Return&nbsp;a/b;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">这才是可能真正发出错误的地方</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">}</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Void&nbsp;test()</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;{</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 31.5pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;Double&nbsp;x=100,y=20.5</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 31.5pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;Try{</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 31.5pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;Cout&lt;<devide(x,y)<<endl;&nbsp; span <><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">抛出异常</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">DevidedByZero</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 31.5pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">}</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 31.5pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">Catch</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">（</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">DevidedByZero&amp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">）</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">{</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 31.5pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;Cerr&lt;&lt;&nbsp;&#8220;&nbsp;Devided&nbsp;by&nbsp;zero!&#8221;&lt;<endl;< span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 42pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">}</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><O:P></O:P></span></p>
<p style="margin-top: 0pt; text-indent: 5.25pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">}<br /></span></p></span></span></span><img src ="http://www.cppblog.com/happem/aggbug/188043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/happem/" target="_blank">happem</a> 2012-08-23 14:39 <a href="http://www.cppblog.com/happem/archive/2012/08/23/188043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C基础：内存耗尽怎么办？</title><link>http://www.cppblog.com/happem/archive/2012/08/21/187824.html</link><dc:creator>happem</dc:creator><author>happem</author><pubDate>Tue, 21 Aug 2012 02:03:00 GMT</pubDate><guid>http://www.cppblog.com/happem/archive/2012/08/21/187824.html</guid><wfw:comment>http://www.cppblog.com/happem/comments/187824.html</wfw:comment><comments>http://www.cppblog.com/happem/archive/2012/08/21/187824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/happem/comments/commentRss/187824.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/happem/services/trackbacks/187824.html</trackback:ping><description><![CDATA[<p style="text-indent: 15.75pt"><span style="font-family: ˎ̥">&nbsp;</span><span style="font-family: 宋体">如果在申请动态内存时找不到足够大的连续字节内存块，</span><span style="font-family: ˎ̥"><a href="http://www.lirenedu.org/index.php?ack=xinwen&amp;id=1006"><span style="font-family: ˎ̥">malloc()</span></a></span><span style="font-family: 宋体">和</span><span style="font-family: ˎ̥"><a href="http://www.lirenedu.org/index.php?ack=xinwen&amp;id=1005"><span style="font-family: ˎ̥">new()</span></a></span><span style="font-family: 宋体">会使用不同的方式宣告内存申请失败，通常有如下几种方式处理&#8220;内存耗尽&#8221;问题：</span><span style="font-family: ˎ̥"></span></p>
<p style="text-indent: -21pt; margin: 0cm 0cm 0pt 39pt"><strong><span style="font-family: ˎ̥">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="font-family: 宋体">判断指针是否为</span><span style="font-family: ˎ̥">NULL</span><span style="font-family: 宋体">，如果是则立刻用</span><span style="font-family: ˎ̥">return</span><span style="font-family: 宋体">语句终止本函数。例如：</span></p>
<p style="margin: 0cm 0cm 0pt 37.5pt"><span style="font-family: ˎ̥">Void Func(void)</span></p>
<p style="margin: 0cm 0cm 0pt 37.5pt"><span style="font-family: ˎ̥">&nbsp;{</span></p>
<p style="margin: 0cm 0cm 0pt 37.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp; A *a=new(nothrow) A</span><span style="font-family: 宋体">；</span></p>
<p style="margin: 0cm 0cm 0pt 37.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp; If</span><span style="font-family: 宋体">（</span><span style="font-family: ˎ̥">a==NULL</span><span style="font-family: 宋体">）</span><span style="font-family: ˎ̥">return</span><span style="font-family: 宋体">；</span></p>
<p style="margin: 0cm 0cm 0pt 37.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">&#8230;&#8230;</span></p>
<p style="text-indent: 5.25pt; margin: 0cm 0cm 0pt 37.5pt"><span style="font-family: ˎ̥">}</span></p>
<p style="text-indent: -21pt; margin: 0cm 0cm 0pt 39pt"><strong><span style="font-family: ˎ̥">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="font-family: 宋体">判断指针是否为</span><span style="font-family: ˎ̥">NULL</span><span style="font-family: 宋体">，如果是则立刻用</span><span style="font-family: ˎ̥">exit(1)</span><span style="font-family: 宋体">终止整个程序的运行，例如：</span></p>
<p style="margin: 0cm 0cm 0pt 37.5pt"><span style="font-family: ˎ̥">Void Func</span><span style="font-family: 宋体">（</span><span style="font-family: ˎ̥">void</span><span style="font-family: 宋体">）</span></p>
<p style="margin: 0cm 0cm 0pt 37.5pt"><span style="font-family: ˎ̥">&nbsp;{</span></p>
<p style="margin: 0cm 0cm 0pt 37.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp; A *a=new(nothrow) A</span><span style="font-family: 宋体">；</span></p>
<p style="margin: 0cm 0cm 0pt 37.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp; If</span><span style="font-family: 宋体">（</span><span style="font-family: ˎ̥">a==NULL</span><span style="font-family: 宋体">）</span><span style="font-family: ˎ̥">exit(1)</span><span style="font-family: 宋体">；</span></p>
<p style="text-indent: 10.5pt; margin: 0cm 0cm 0pt 37.5pt"><span style="font-family: ˎ̥">}</span></p>
<p style="text-indent: -21pt; margin: 0cm 0cm 0pt 39pt"><strong><span style="font-family: ˎ̥">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="font-family: 宋体">为</span><span style="font-family: ˎ̥">new</span><span style="font-family: 宋体">和</span><span style="font-family: ˎ̥">malloc()</span><span style="font-family: 宋体">预设异常处理函数，例如，</span><span style="font-family: ˎ̥">Visual C++</span><span style="font-family: 宋体">可以用</span><span style="font-family: ˎ̥">_set_new_hander</span><span style="font-family: 宋体">函数为</span><span style="font-family: ˎ̥">new</span><span style="font-family: 宋体">设置用户自定义异常处理函数，也可以让</span><span style="font-family: ˎ̥">malloc()</span><span style="font-family: 宋体">享用与</span><span style="font-family: ˎ̥">new</span><span style="font-family: 宋体">相同的异常处理函数。</span></p>
<p style="text-indent: -21pt; margin: 0cm 0cm 0pt 39pt"><strong><span style="font-family: ˎ̥">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="font-family: 宋体">捕获</span><span style="font-family: ˎ̥">new</span><span style="font-family: 宋体">抛出的异常，并尝试从中恢复。</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;</span><span style="font-family: 宋体">上述</span><span style="font-family: ˎ̥">(1)</span><span style="font-family: 宋体">和（</span><span style="font-family: ˎ̥">2</span><span style="font-family: 宋体">）两种方式使用最普通。如果一个函数内有多处需要动态申请内存，那么方式</span><span style="font-family: ˎ̥">(1)</span><span style="font-family: 宋体">就显得力不从心，应该用方式（</span><span style="font-family: ˎ̥">2</span><span style="font-family: 宋体">）来处理。不过在</span><span style="font-family: ˎ̥">C++</span><span style="font-family: 宋体">中我们提倡使用方式</span><span style="font-family: ˎ̥">(4)</span><span style="font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;</span><span style="font-family: 宋体">有一个很重要的现象要告诉大家：</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">对于</span><span style="font-family: ˎ̥">32</span><span style="font-family: 宋体">位以上的应用程序而言，一般情况下使用</span><span style="font-family: ˎ̥">malloc()</span><span style="font-family: 宋体">和</span><span style="font-family: ˎ̥">new</span><span style="font-family: 宋体">几乎不可能导致&#8216;内存耗尽&#8217;。我在</span><span style="font-family: ˎ̥">windows98</span><span style="font-family: 宋体">下用</span><span style="font-family: ˎ̥">Visual C++</span><span style="font-family: 宋体">编写了测试程序：</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;</span><span style="font-family: 宋体">这个程序无休地运行下去，根本不会终止，因为</span><span style="font-family: ˎ̥">32</span><span style="font-family: 宋体">位操作系统支持&#8216;虚存&#8217;，内存用完了，自动用硬件空间顶替。</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp; Void main</span><span style="font-family: 宋体">（）</span></p>
<p style="text-indent: 5.25pt; margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">{&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp; Int *p=NULL</span><span style="font-family: 宋体">；</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp; Unsigned int len=1024*1024</span><span style="font-family: 宋体">；</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp; While</span><span style="font-family: 宋体">（</span><span style="font-family: ˎ̥">1</span><span style="font-family: 宋体">）</span><span style="font-family: ˎ̥">{</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;P=new(nothrow) int[len]</span><span style="font-family: 宋体">；</span><span style="font-family: ˎ̥">&nbsp;//</span><span style="font-family: 宋体">或者</span><span style="font-family: ˎ̥"> malloc(sizeof(int)*len)</span><span style="font-family: 宋体">；</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If(!p){</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Len&gt;&gt;=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //len</span><span style="font-family: 宋体">缩小一半</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If</span><span style="font-family: 宋体">（</span><span style="font-family: ˎ̥">len==0</span><span style="font-family: 宋体">）</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit(1)</span><span style="font-family: 宋体">；</span></p>
<p style="margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Continue</span><span style="font-family: 宋体">；</span></p>
<p style="text-indent: 10.5pt; margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">}</span></p>
<p style="text-indent: 10.5pt; margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;Cout&lt;&lt;</span><span style="font-family: 宋体">&#8220;</span><span style="font-family: ˎ̥">Allocated</span><span style="font-family: 宋体">：&#8221;</span><span style="font-family: ˎ̥">&lt;&lt;</span><span style="font-family: 宋体">&#8220;（</span><span style="font-family: ˎ̥">len*sizeof(int)</span><span style="font-family: 宋体">）&#8221;</span><span style="font-family: ˎ̥">&lt;&lt;</span><span style="font-family: 宋体">&#8220;</span><span style="font-family: ˎ̥">bytes.</span><span style="font-family: 宋体">&#8221;</span><span style="font-family: ˎ̥">&lt;&lt;endl</span><span style="font-family: 宋体">；</span></p>
<p style="text-indent: 10.5pt; margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">}</span></p>
<p style="text-indent: 5.25pt; margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">}</span></p>
<p style="text-indent: 5.25pt; margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: 宋体">可以得出一个结论：</span></p>
<p style="text-indent: 5.25pt; margin: 0cm 0cm 0pt 16.5pt"><span style="font-family: ˎ̥">&nbsp;&nbsp; </span><span style="font-family: 宋体; color: red">对于</span><span style="font-family: ˎ̥; color: red">32</span><span style="font-family: 宋体; color: red">位以上应用程序，内存耗尽错误处理程序几乎毫无用处，但是必须强调不加错误处理将导致程序的质量很差，千万不可因小失大。</span></p><img src ="http://www.cppblog.com/happem/aggbug/187824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/happem/" target="_blank">happem</a> 2012-08-21 10:03 <a href="http://www.cppblog.com/happem/archive/2012/08/21/187824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>