国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C++語言常見問題解答(2)

2019-11-17 05:44:08
字體:
來源:轉載
供稿:網友

== Part 2/4  ============================  ============================= 
■□ 第9節:自由記憶體治理 
============================= 
 
Q33:"delete p" 會刪去 "p" 指標,還是它指到的資料,"*p" ? 
 
該指標指到的資料。 
 
"delete" 真正的意思是:「刪去指標所指到的東西」(delete the thing pointed 
to by)。同樣的英文誤用也發生在 C 語言的「『釋放』指標所指向的記憶體」上 
("free(p)" 真正的意思是:"free_the_stuff_pointed_to_by(p)" )。 
 
======================================== 
 
Q34:我能 "free()" 掉由 "new" 配置到的、"delete" 掉由 "malloc()" 配置到的 
      記憶體嗎? 
 
不行。 
 
在同一個程式里,使用 malloc/free 及 new/delete 是完全合法、合理、安全的; 
但 free 掉由 new 配置到的,或 delete 掉由 malloc 配置到的指標則是不合法、 
不合理、該被痛罵一頓的。 
 
======================================== 
 
Q35:為什麼該用 "new" 而不是老字號的 malloc() ? 
 
建構子/解構子、型別安全性、可被覆蓋(overridability)。 
 
建構子/解構子:和 "malloc(sizeof(Fred))" 不同,"new Fred()" 還會去呼叫 
Fred 的建構子。同理,"delete p" 會去呼叫 "*p" 的解構子。 
 
型別安全性:malloc() 會傳回一個不具型別安全的 "void*",而 "new Fred()" 則 
會傳回正確型態的指標(一個 "Fred*")。 
 
可被覆蓋:"new" 是個可被物件類別覆蓋的運算子,而 "malloc" 不是以「各個類別 
」作為覆蓋的基準。 
 
======================================== 
 
Q36:為什麼 C++ 不替 "new" 及 "delete" 搭配個 "realloc()" ? 
 
避免你產生意外。 
 
當 realloc() 要拷貝配置區時,它做的是「逐位元 bitwise」的拷貝,這會弄壞大 

部份的 C++ 物件。不過 C++ 的物件應該要能自我拷貝才對:用它們自己的拷貝建構 
子或設定運算子。 
 
======================================== 
 
Q37:我該怎樣配置/釋放陣列? 
 
用 new[] 和 delete[] : 
 
         Fred* p = new Fred[100]; 
         //... 
         delete [] p; 
 
每當你在 "new" 運算式中用了 "[...]",你就必須在 "delete" 陳述中使用 "[]"。 
                                          ^^^^ 
這語法是必要的,因為「指向單一元素的指標」與「指向一個陣列的指標」在語法上 
并無法區分開來。 
 
======================================== 
 
Q38:萬一我忘了將 "[]" 用在 "delete" 由 "new Fred[n]" 配置到的陣列,會發生 
      什麼事? 
 
災難。 
 
這是程式者的--而不是編譯器的--責任,去確保 new[] 與 delete[] 的正確配 
對。若你弄錯了,編譯器不會產生任何編譯期或執行期的錯誤訊息。堆積(heap)被 
破壞是最可能的結局,或是更糟的,你的程式會當掉。 
 
======================================== 
 
Q39:成員函數做 "delete this" 的動作是合法的(并且是好的)嗎? 
 
只要你小心的話就沒事。 
 
我所謂的「小心」是: 
 
   1) 你得 100% 確定 "this" 是由 "new" 配置來的(而非 "new[]",亦非自訂的 
      "new" 版本,一定要是最原始的 "new")。 
 
   2) 你得 100% 確定該成員函數是此物件最後一個會呼叫到的。 
 
   3) 做完自殺的動作 ("delete this;") 後,你不能再去碰 "this" 的物件了,包 
      括資料及運作行為在內。 
 
   4) 做完自殺的動作 ("delete this;") 後,你不能再去碰 "this" 指標了。 
      換句話說,你不能查看它、將它與其他指標或是 NULL 相比較、印出其值、 
      對它轉型、對它做任何事情。 
 
很自然的,這項警告也適用於:當 "this" 是個指向基底類別的指標,而解構子不是 

virtual 的場合。 
 
======================================== 
 
Q40:我該怎麼用 new 來配置多維陣列? 
 
有很多方法,端視你對陣列大小的伸縮性之要求而定。極端一點的情形,假如你在編 
譯期就知道所有陣列的維度,你可以靜態地配置(就像 C 一樣): 
 
         class Fred { /*...*/ }; 
 
         void manipulateArray() 
         { 
           Fred matrix[10][20]; 
 
           //使用 matrix[i][j]...

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 苏尼特右旗| 西城区| 安多县| 临猗县| 永胜县| 巴东县| 龙游县| 迁西县| 安顺市| 日喀则市| 勐海县| 禄丰县| 汾阳市| 临颍县| 阳新县| 织金县| 神木县| 武山县| 宽城| 福安市| 黔东| 东城区| 克什克腾旗| 达日县| 平江县| 张家口市| 繁昌县| 东海县| 望谟县| 华安县| 威信县| 和平区| 博乐市| 宜春市| 淳化县| 宣武区| 那曲县| 涟源市| 仁寿县| 郸城县| 恭城|