討論區快速選單
知識庫快速選單
討論區最近新進100則主題 傑米的攝影旅遊筆記 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
malloc V.S. new (有什麼不同)?
更改我的閱讀文章字型大小
作者 : thorx(666) 人氣指數超過10000點
[ 貼文 81 | 人氣 27070 | 評價 0 | 評價/貼文 0 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/4/8 下午 02:44:09
如題,
在c++中,
malloc 和 new 都是配置記憶體,
但我一直都用new,好像也都OK,malloc是什麼時候才會派上用場?
作者 : jhlx(J)
[ 貼文 18 | 人氣 0 | 評價 110 | 評價/貼文 6.11 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/4/8 下午 03:39:14
malloc() 是 C standard library 提供的..
在 C++ 裡面可能用不著.. 當然你要用還是可以.
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人thorx註記此篇回應為最佳解答 2007/4/9 上午 12:17:25
>如題,
>在c++中,
>malloc 和 new 都是配置記憶體,

首先要了解它們有些什麼不同:

1. new 是個「運算子」(operator). malloc() 是個函式.


2. new 知道類型, 所配置的大小是以類型為單位, 你只需寫需要多少個元素:

   const size_t ARRAY_SIZE = 30;
   int *pi = new int[ARRAY_SIZE];

  malloc() 只會配置 bytes, 所以你還得乘上類型的大小:
   int *pi = (int*)malloc(ARRAY_SIZE * sizeof *pi);


3. malloc() 在 C 裡使用不需 typecast. C++ 是個 strong-typed language, 在 C++ 裡使用 malloc() 需要 typecast.


4. 因為 new 知道類型, 所以在配置後, new 會呼叫 constructor 來初始化所配置的記憶體. malloc() 只管配置.


5. new 可以 overload. 每一個 class 可以有自己特殊用途的 new. Global 的 new 也可以 overload.


>但我一直都用new,好像也都OK,malloc是什麼時候才會派上用場?

總的來說, new 比 malloc() powerful, 同時在盡量不用 typecast 的前提下, 使用 C++, 應該用 new, 而不是用 malloc.

作者 : kevin20060520(kevin) 貼文超過500則人氣指數超過100000點
[ 貼文 718 | 人氣 132860 | 評價 60 | 評價/貼文 0.08 | 送出評價 60 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/4/1 上午 12:03:52
new , malloc 和HeapAlloc,LocalAlloc,virtualAlloc 有什么分別??
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/4/1 下午 09:12:40
>那 new , malloc 和HeapAlloc,LocalAlloc,virtualAlloc 有什么分別??

new 跟 malloc() 是語言標準之一, 任何符合標準的編譯器都有支援.

後面三個是跟平臺有關的, 非標準的 API, 只能在有支援的平臺使用. 它們之間的分別, 請自己去參考相關的說明.

作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/4/2 上午 10:20:53
>那 new , malloc 和HeapAlloc,LocalAlloc,virtualAlloc 有什么分別??
new 和 malloc 的不同,除了物件的建構解構外,malloc是可以resize的。
為了降底memory碎片化,malloc的記憶體配置總是會比要求的size大一些。
例如 allocate 256 bytes,實際可能配置了1024 bytes的記憶體。
new 沒有 resize 的問題,所以記憶體的配置會剛剛好,不會比要求的多。

記憶體的配置,通常是以 Heap 的資料結構來管理。
早期的 OS 有Local Heap 和 Local Heap。
一個 Process 被執行時,除了被配置了程式和變數空間外,還會有一塊自由
記憶體,通常稱為 local heap(大小可以使用編譯器的參數調整)。
所謂 LocalAlloc 就是在這一塊記憶體配置記憶體。
相對 LocalAlloc,就是 GlobalAlloc,它是在系統的記憶體(稱為 Global Heap)
配置要求。
local heap 在 process 結束時,會隨著程式空間一起釋放掉,但若你在 global heap
配置記憶體沒有釋放它而結束程式,那麼那塊記憶體不會被釋放,而永遠佔用(直到重開機)。

新的 OS (像 Win32),Process 執行期是可以改變(resize)local heap的。
也就是說LocalAlloc要求配置,而local heap 記憶體不足時可以向系統要求增大(resize)。
在這樣的架構下,GlobalAlloc 已經不需要了,所以新的OS和塔配的編譯器已經沒有所謂的
global 或 local heap。malloc,LocalAlloc,GlobalAlloc實際上都是在Local Heap上配置。
保留那些函式名稱,只是為了程式的相容性而已。

至於virtualAlloc,那是一個較低階的記憶體配置。X86 自 286 以來,就有保護地址模式
存在。它可以使用虛擬地址映射到物理儲存裝置(不一定是記體體)。前面談的記憶體配置,
在底層裡面,實際上也都會和 virtualAlloc有關。

作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/4/2 上午 10:22:09
訂正:
早期的 OS 有Local Heap 和 Global Heap。
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/4/2 上午 10:41:18
Oh, 還有一個 HeapAlloc ^^
除了前面講的 Local/Global Heap 外,使用
HeapCreate 可以建立另一塊私有的 Heap。
HeapAlloc 就是在這一塊私有的Heap配置記憶體。
作者 : kevin20060520(kevin) 貼文超過500則人氣指數超過100000點
[ 貼文 718 | 人氣 132860 | 評價 60 | 評價/貼文 0.08 | 送出評價 60 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/4/5 上午 03:17:58
謝謝大大的回答,
另外我還想知, SEH , 和 HEAP 有什么不同????
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/4/6 上午 11:20:54
>另外我還想知, SEH , 和 HEAP 有什么不同????
完全不相干的兩個東西。
作者 : kevin20060520(kevin) 貼文超過500則人氣指數超過100000點
[ 貼文 718 | 人氣 132860 | 評價 60 | 評價/貼文 0.08 | 送出評價 60 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/4/7 下午 08:46:29
>新的 OS (像 Win32),Process 執行期是可以改變(resize)local heap的。
>也就是說LocalAlloc要求配置,而local heap 記憶體不足時可以向系統要求增大(resize)。

最多可以增加到多大?? WIN32 可以有 2GB ??
另外我想問:
char* buf1=(char)malloc(200);
如果我寫入大過200的character(如:300) 那它會否自動增大來接受我大出來的100 character 呢??
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/4/7 下午 09:24:57
>另外我想問:
>char* buf1=(char)malloc(200);

錯誤的 typecast. 如果你是用 C, 不需 typecast:
  buf1 = malloc(200);

C++ 用 new:
  buf1 = new char[200];

>如果我寫入大過200的character(如:300) 那它會否自動增大來接受我大出來的100 character 呢??

不會, 一旦超出就會造成不可預期的結果. 請問你有去讀 malloc() 的說明嗎?
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.1875