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

📄 00000001.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>&nbsp;<BR>==&nbsp;Part&nbsp;2/4&nbsp;&nbsp;============================&nbsp;<BR>&nbsp;<BR>comp.lang.c++&nbsp;Frequently&nbsp;Asked&nbsp;Questions&nbsp;list&nbsp;(with&nbsp;answers,&nbsp;fortunately).&nbsp;<BR>Copyright&nbsp;(C)&nbsp;1991-96&nbsp;Marshall&nbsp;P.&nbsp;Cline,&nbsp;Ph.D.&nbsp;<BR>Posting&nbsp;2&nbsp;of&nbsp;4.&nbsp;<BR>Posting&nbsp;#1&nbsp;explains&nbsp;copying&nbsp;permissions,&nbsp;(no)warranty,&nbsp;table-of-contents,&nbsp;etc&nbsp;<BR>&nbsp;<BR>=============================&nbsp;<BR>■□&nbsp;第9节:自由记忆体管理&nbsp;<BR>=============================&nbsp;<BR>&nbsp;<BR>Q33:&quot;delete&nbsp;p&quot;&nbsp;会删去&nbsp;&quot;p&quot;&nbsp;指标,还是它指到的资料,&quot;*p&quot;&nbsp;?&nbsp;<BR>&nbsp;<BR>该指标指到的资料。&nbsp;<BR>&nbsp;<BR>&quot;delete&quot;&nbsp;真正的意思是:「删去指标所指到的东西」(delete&nbsp;the&nbsp;thing&nbsp;pointed&nbsp;<BR>to&nbsp;by)。同样的英文误用也发生在&nbsp;C&nbsp;语言的「『释放』指标所指向的记忆体」上&nbsp;<BR>(&quot;free(p)&quot;&nbsp;真正的意思是:&quot;free_the_stuff_pointed_to_by(p)&quot;&nbsp;)。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q34:我能&nbsp;&quot;free()&quot;&nbsp;掉由&nbsp;&quot;new&quot;&nbsp;配置到的、&quot;delete&quot;&nbsp;掉由&nbsp;&quot;malloc()&quot;&nbsp;配置到的&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;记忆体吗?&nbsp;<BR>&nbsp;<BR>不行。&nbsp;<BR>&nbsp;<BR>在同一个程式里,使用&nbsp;malloc/free&nbsp;及&nbsp;new/delete&nbsp;是完全合法、合理、安全的;&nbsp;<BR>但&nbsp;free&nbsp;掉由&nbsp;new&nbsp;配置到的,或&nbsp;delete&nbsp;掉由&nbsp;malloc&nbsp;配置到的指标则是不合法、&nbsp;<BR>不合理、该被痛骂一顿的。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q35:为什麽该用&nbsp;&quot;new&quot;&nbsp;而不是老字号的&nbsp;malloc()&nbsp;?&nbsp;<BR>&nbsp;<BR>建构子/解构子、型别安全性、可被覆盖(overridability)。&nbsp;<BR>&nbsp;<BR>建构子/解构子:和&nbsp;&quot;malloc(sizeof(Fred))&quot;&nbsp;不同,&quot;new&nbsp;Fred()&quot;&nbsp;还会去呼叫&nbsp;<BR>Fred&nbsp;的建构子。同理,&quot;delete&nbsp;p&quot;&nbsp;会去呼叫&nbsp;&quot;*p&quot;&nbsp;的解构子。&nbsp;<BR>&nbsp;<BR>型别安全性:malloc()&nbsp;会传回一个不具型别安全的&nbsp;&quot;void*&quot;,而&nbsp;&quot;new&nbsp;Fred()&quot;&nbsp;则&nbsp;<BR>会传回正确型态的指标(一个&nbsp;&quot;Fred*&quot;)。&nbsp;<BR>&nbsp;<BR>可被覆盖:&quot;new&quot;&nbsp;是个可被物件类别覆盖的运算子,而&nbsp;&quot;malloc&quot;&nbsp;不是以「各个类别&nbsp;<BR>」作为覆盖的基准。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q36:为什麽&nbsp;C++&nbsp;不替&nbsp;&quot;new&quot;&nbsp;及&nbsp;&quot;delete&quot;&nbsp;搭配个&nbsp;&quot;realloc()&quot;&nbsp;?&nbsp;<BR>&nbsp;<BR>避免你产生意外。&nbsp;<BR>&nbsp;<BR>当&nbsp;realloc()&nbsp;要拷贝配置区时,它做的是「逐位元&nbsp;bitwise」的拷贝,这会弄坏大&nbsp;<BR>部份的&nbsp;C++&nbsp;物件。不过&nbsp;C++&nbsp;的物件应该要能自我拷贝才对:用它们自己的拷贝建构&nbsp;<BR>子或设定运算子。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q37:我该怎样配置/释放阵列?&nbsp;<BR>&nbsp;<BR>用&nbsp;new[]&nbsp;和&nbsp;delete[]&nbsp;:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fred*&nbsp;p&nbsp;=&nbsp;new&nbsp;Fred[100];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//...&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]&nbsp;p;&nbsp;<BR>&nbsp;<BR>每当你在&nbsp;&quot;new&quot;&nbsp;运算式中用了&nbsp;&quot;[...]&quot;,你就必须在&nbsp;&quot;delete&quot;&nbsp;陈述中使用&nbsp;&quot;[]&quot;。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^^^^&nbsp;<BR>这语法是必要的,因为「指向单一元素的指标」与「指向一个阵列的指标」在语法上&nbsp;<BR>并无法区分开来。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q38:万一我忘了将&nbsp;&quot;[]&quot;&nbsp;用在&nbsp;&quot;delete&quot;&nbsp;由&nbsp;&quot;new&nbsp;Fred[n]&quot;&nbsp;配置到的阵列,会发生&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;什麽事?&nbsp;<BR>&nbsp;<BR>灾难。&nbsp;<BR>&nbsp;<BR>这是程式者的--而不是编译器的--责任,去确保&nbsp;new[]&nbsp;与&nbsp;delete[]&nbsp;的正确配&nbsp;<BR>对。若你弄错了,编译器不会产生任何编译期或执行期的错误讯息。堆积(heap)被&nbsp;<BR>破坏是最可能的结局,或是更糟的,你的程式会当掉。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q39:成员函数做&nbsp;&quot;delete&nbsp;this&quot;&nbsp;的动作是合法的(并且是好的)吗?&nbsp;<BR>&nbsp;<BR>只要你小心的话就没事。&nbsp;<BR>&nbsp;<BR>我所谓的「小心」是:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;1)&nbsp;你得&nbsp;100%&nbsp;确定&nbsp;&quot;this&quot;&nbsp;是由&nbsp;&quot;new&quot;&nbsp;配置来的(而非&nbsp;&quot;new[]&quot;,亦非自订的&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;new&quot;&nbsp;版本,一定要是最原始的&nbsp;&quot;new&quot;)。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;2)&nbsp;你得&nbsp;100%&nbsp;确定该成员函数是此物件最後一个会呼叫到的。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;3)&nbsp;做完自杀的动作&nbsp;(&quot;delete&nbsp;this;&quot;)&nbsp;後,你不能再去碰&nbsp;&quot;this&quot;&nbsp;的物件了,包&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;括资料及运作行为在内。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;4)&nbsp;做完自杀的动作&nbsp;(&quot;delete&nbsp;this;&quot;)&nbsp;後,你不能再去碰&nbsp;&quot;this&quot;&nbsp;指标了。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;换句话说,你不能查看它、将它与其他指标或是&nbsp;NULL&nbsp;相比较、印出其值、&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对它转型、对它做任何事情。&nbsp;<BR>&nbsp;<BR>很自然的,这项警告也适用於:当&nbsp;&quot;this&quot;&nbsp;是个指向基底类别的指标,而解构子不是&nbsp;<BR>virtual&nbsp;的场合。&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q40:我该怎麽用&nbsp;new&nbsp;来配置多维阵列?&nbsp;<BR>&nbsp;<BR>有很多方法,端视你对阵列大小的伸缩性之要求而定。极端一点的情形,如果你在编&nbsp;<BR>译期就知道所有阵列的维度,你可以静态地配置(就像&nbsp;C&nbsp;一样):&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;Fred&nbsp;{&nbsp;/*...*/&nbsp;};&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;manipulateArray()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fred&nbsp;matrix[10][20];&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使用&nbsp;matrix[i][j]...&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不须特地去释放该阵列&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>另一个极端情况,如果你希望该矩阵的每个小块都能不一样大,你可以在自由记忆体&nbsp;<BR>里配置之:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;manipulateArray(unsigned&nbsp;nrows,&nbsp;unsigned&nbsp;ncols[])&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//'nrows'&nbsp;是该阵列之列数。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//所以合法的列数为&nbsp;(0,&nbsp;nrows-1)&nbsp;开区间。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//'ncols[r]'&nbsp;则是&nbsp;'r'&nbsp;列的行数&nbsp;('r'&nbsp;值域为&nbsp;[0..nrows-1])。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fred**&nbsp;matrix&nbsp;=&nbsp;new&nbsp;Fred*[nrows];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(unsigned&nbsp;r&nbsp;=&nbsp;0;&nbsp;r&nbsp;&lt;&nbsp;nrows;&nbsp;++r)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matrix[r]&nbsp;=&nbsp;new&nbsp;Fred[&nbsp;ncols[r]&nbsp;];&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使用&nbsp;matrix[i][j]...&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//释放就是配置的反动作:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(r&nbsp;=&nbsp;nrows;&nbsp;r&nbsp;&gt;&nbsp;0;&nbsp;--r)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]&nbsp;matrix[r-1];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]&nbsp;matrix;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>========================================&nbsp;<BR>&nbsp;<BR>Q41:C++&nbsp;能不能做到在执行时期才指定阵列的长度?&nbsp;<BR>&nbsp;<BR>可以。STL&nbsp;有一个&nbsp;vector&nbsp;template&nbsp;提供这种行为。请参考“程式库”一节的&nbsp;STL&nbsp;<BR>项目。&nbsp;<BR>&nbsp;<BR>不行。内建的阵列型态必须在编译期就指定它的长度了。&nbsp;<BR>&nbsp;<BR>可以,内建的阵列可以在执行期才指定第一个索引的□围。譬如说,和上一则&nbsp;FAQ&nbsp;<BR>相较,如果你只需要第一个维度大小能够变动,你可以&nbsp;new&nbsp;一个阵列的阵列(而不&nbsp;<BR>是阵列指标的阵列&nbsp;&quot;an&nbsp;array&nbsp;of&nbsp;pointers&nbsp;to&nbsp;arrays&quot;):&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;unsigned&nbsp;ncols&nbsp;=&nbsp;100;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//'ncols'&nbsp;不是执行期才决定的变数&nbsp;(用来代表阵列的行数)&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;Fred&nbsp;{&nbsp;...&nbsp;};&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;manipulateArray(unsigned&nbsp;nrows)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//'nrows'&nbsp;是执行期才决定的变数&nbsp;(用来代表阵列的列数)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fred&nbsp;(*matrix)[ncols]&nbsp;=&nbsp;new&nbsp;Fred[nrows][ncols];&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//用&nbsp;matrix[i][j]&nbsp;来处理&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//deletion&nbsp;是物件配置的逆运算:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]&nbsp;matrix;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>如果你不光是需要在执行期改变阵列的第一个维度的话,就不能这样做了。&nbsp;<BR>

⌨️ 快捷键说明

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