Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and beginning April 20th, 2021 (Eastern Time) the Yahoo Answers website will be in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

malloc和new error handling不同處?

主要有兩個問題:

1.

在知識+提到malloc和new error handling的不同

http://tw.knowledge.yahoo.com/question/question?qi...

我想知道兩者handling有何不同?

2.

另外我想請問在

http://www.programmer-club.com/ShowSameTitleN/c/34...

所提到的關於兩者分配記憶體的敘述是否是真的。

-------------------------以下引用自網頁-----------------------------------

new 和 malloc 的不同,除了物件的建構解構外,malloc是可以resize的。

為了降底memory碎片化,malloc的記憶體配置總是會比要求的size大一些。

例如 allocate 256 bytes,實際可能配置了1024 bytes的記憶體。

new 沒有 resize 的問題,所以記憶體的配置會剛剛好,不會比要求的多。

-------------------------以上引用自網頁-----------------------------------

1 Answer

Rating
  • novus
    Lv 6
    1 decade ago
    Favorite Answer

    最明顯的行為差異是,malloc 透過回傳值指出錯誤,而 new 則是會 throw std::bad_alloc。

    這表示如果程式當中沒有人捕捉 new 發生的異常,程式會自動安全的結束,意思是該解構、該釋放的東西都還是會正常處理掉。如果不檢查 malloc 回傳值導致的程式異常終止,就只能看運氣了。

    在細部來看 new 內部有兩個可客製化的組件

    1. 是 operator new,這是一個負責供應記憶體位址給 new 的函式,行為和 malloc很像,只負責配置記憶體,不管 type 也不會呼叫 constructor。這個部分的行為可以透過 operator overloading 定製。

    在實作上也可以直接把 malloc 包裝成 operator new,於是 new 就會拿到 malloc 所供應的記憶體,然後在其上呼叫 constructor。

    2. 是 new_handler。這是當 operator new 無法配置足夠記憶體時所呼叫的函數。如果 new_handler 不存在或無法解決此問題,就應該要 throw bad_alloc

    只要知道 malloc 可以 resize 這個外部行為即可。

    下面那段陳述只是其中一種實作方式,不要太依賴這種資訊,每種編譯器、平台的特性各不相同,實作法也各有差異。例如說有些比較早的編譯器可能直接用malloc 來實作預設的 new,那麼就算你用 new 也同樣會配得一堆未使用記憶體。

    關於 operator new 我曾寫過一些不太完善、也沒甚麼系統的說明

    http://tw.knowledge.yahoo.com/question/question?qi...

Still have questions? Get your answers by asking now.