關於指標和記憶體的幾個問題

來源:互聯網
上載者:User

一、"delete p" 會刪去 "p" 指標,還是它指到的資料,"*p" ?

該指標指到的資料。"delete" 真正的意思是:「刪去指標指到的東西」(delete the thing pointed to by)。同樣的英文誤用也發生在 C 語言的「釋放」指標所指向的記憶體("free(p)"真正的意思是:"free_the_stuff_pointed_to_by(p)" )。

二、能 "free()" 掉由 "new" 配置到的、"delete" 掉由 "malloc()" 配置到的記憶體嗎?

不行。在同一個程式裡,使用 malloc/free 及 new/delete 是完全合法、合理、安全的;但 free 掉由 new 配置到的,或 delete 掉由 malloc 配置到的指標則是不合法、不合理的。

三、為什麽該用 "new" 而不是 malloc() ?

建構子/解構子、型別安全性、可被覆蓋(overridability)。建構子/解構子:和 "malloc(sizeof(Fred))" 不同,"new Fred()" 還會去呼叫Fred 的建構子。同理,"delete p" 會去呼叫 "*p" 的解構子。

型別安全性:malloc() 會傳回一個不具型別安全的 "void*",而 "new Fred()" 則會傳回正確型態的指標(一個 "Fred*")。

可被覆蓋:"new" 是個可被物件類別覆蓋的運運算元,而 "malloc" 不是以「各個類別」作為覆蓋的基準。

四、為什麽 C++ 不替 "new" 及 "delete" 搭配個 "realloc()" ?

避免你產生意外。當 realloc() 要拷貝配置區時,它做的是「逐位元 bitwise」的拷貝,這會弄壞大

部份的 C++ 物件。不過 C++ 的物件應該可以自我拷貝才對:用它們自己的拷貝建構子或設定運運算元。

五、該怎樣配置/釋放陣列?

用 new[] 和 delete[] :

Fred* p = new Fred[100];

//...

delete [] p;

每當你在 "new" 運算式中用了 "[...]" 的話,你就 *!*必須*!* 在 "delete" 陳述中使用 "[]" 。這文法是必要的,因為「指向單一元素的指標」與「指向一個陣列的指標」在文法上並無法區分開來。

六、萬一我忘了將 "[]" 用在 "delete" 由 "new Fred[n]" 配置到的陣列,會發生什麽事?

災難。這是程式者的--而不是編譯器的--責任,去確保 new[] 與 delete[] 的正確配對。若你弄錯了,編譯器不會產生任何編譯期或執行期的錯誤訊息。堆積(heap)被破壞是最可能的結局,或是更糟的,你的程式會當掉。

七、成員函數做 "delete this" 的動作是合法的(並且是好的)嗎?

只要你小心的話就沒事。所謂的「小心」是:

1) 你得 100% 確定 "this" 是由 "new" 配置來的(而非 "new[]",亦非自訂的  "new" 版本,一定要是最原始的 "new")。

2) 你得 100% 確定該成員函數是此物件最後一個會去呼叫的。

3) 做完自殺的動作 ("delete this;") 後,你不能再去碰 "this" 的物件了,包括資料及運作行為在內。

4) 做完自殺的動作 ("delete this;") 後,你不能再去碰 "this" 指標了。換句話說,你不能查看它、將它與其他指標或是 NULL 相比較、印出其值、對它轉型、對它做任何事情。

很自然的,這項警告也適用於:當 "this" 是個指向基底類別的指標,而解構子不是virtual 的場合。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.