#請益 C++ 裡 new 與 malloc 的差別

2021年8月8日 06:29
各位大神好: 小弟學 C++ 不精,最近要寫一些 Memory allocation,但是不懂 new 與 malloc 的 memory allocation 有什麼差異? 因為 new 可以用 collection initializer,例如:int *arr = new int[3]{1,2,3};,比用 malloc 可以省很多行,只是不知道後續 delete 會不會騰出 memory 出來? #更 我再重新查了一下,但有看沒有完全懂,文章說 C++ 裡的 new 並未特別指定會在哪個 memory allocation,我更搞混了😵‍💫
謝謝🙏
10
留言 39
文章資訊
10 篇文章957 人追蹤
Logo
每天有 6 則貼文
共 39 則留言
長庚大學
其實你在 Google 搜尋一下 「new malloc 差別」 就有超級多文章再討論這個了 你有先去爬文過了嗎? 另外 C 裡面沒有 new/delete 喔 那是 C++ 的語法
國立中正大學 資訊工程學系
同上,new 是c++ 語法
國立清華大學
c裡面沒new 除非你用cpp 寫c語言 我就講一個差別 new和malloc回傳值不同 malloc一率是void型態的指標,所以要進行轉型 也就是(型態)malloc
國立臺灣大學
New delete 會呼叫物件的 constructor 跟 destructor
國立雲林科技大學
new 是c++的 底層是malloc
B1 有先 google,但有些文章用詞不太詳細,所以我不是很確定 memory 上的操作。 我確定 malloc 是使用 heap memory,但 new 卻只說 dynamic memory allocation,沒有提到是否用 Heap。 我會更正一下語言的名稱。
B5 原來如此,所以 new 是使用 Heap memory,destructor 就會 free()了
B2 B3 B4 語言名稱我修改了,但 memory allocation 的部分,有沒有差別呢? 我上面有貼一篇 “Does new always allocate on the heap?” 的 stackoverflow 討論,有人指說 If it is of value type, it is allocated on the stack (eg. local variable) or on the heap (eg. boxed object, member of a reference type object). ,所以說 char *ptr = new char[3]; 是 allocate 在 heap 囉?
國立交通大學
B8 4 只要是new和malloc的資源都是heap 而且要自己free
B9 上述的 declaration( char *ptr = new char[3];),那請問使用 delete ptr 與delete[] ptr來 free memory 的差別是什麼? #更 看來如果是array就一定要加[]。 但他沒說是哪種 error,我猜可能是 memory leak?
國立清華大學
Stack Overflow 的解答滿完整的啊...
國立交通大學
B10 其實delete只是把記憶體位置標示成不能再用而已 並沒有真正的釋放空間 只是等到你要再使用heap的空間上時這些你free過的記憶體位置可以再拿來allocate而已 你可以做個實驗就是你free完其實還可以再去access那些東西,那些值都還在 只是可能會碰到undefined behavior 的問題而已
長庚大學
B10 char* ptr = new char[3]; 的時候 你會跟記憶體要過來三格空間 如果只用 delete ptr; 那系統只會把 ptr 所在的那一格 free 掉 剩下的 ptr[1] 跟 ptr[2] 就會留在記憶體裡面 沒人可以使用他 也沒有人可以釋放掉他 因為根本沒有指標指向他們也沒有人知道他們在哪裡了 唯一把他們釋放掉的方式只剩整個程式停掉重跑 長久下來你就會累積大量被佔用的記憶體 然後你記憶體就會不夠用 所以才需要使用 delete [] ptr; 系統就會知道你想要把整個陣列空間都釋放掉
國立交通大學
B10 我C++也沒有很熟 不過你說的這個問題應該是new出來的array要使用delete[] 應該是跟array大小有關,如果只是delete ptr compiler並不會知道你要釋放多少的空間 如果有錯就糾正我 這樣我也會學到東西
國立政治大學
一個會call constructor一個不會的樣子
國立臺灣大學
B7 new 會用一塊 heap,然後呼叫 constructor,delete 會呼叫 destructor 然後把那塊記憶體當成沒人用,但不會去清空
B11 第一次看到”Free Store”這名詞😂 目前有看沒有懂,我再去研究研究。
B12 Hmmm… 一下delete一下free看不太懂,delete把空間標示不能用,不就不能再用了嗎(´・_・`)
匿名
這則留言已被刪除
已經刪除的內容就像 Dcard 一樣,錯過是無法再相見的!
B19 那 delete 沒釋放(可是上面交大貼的淺談 new/delete 又說有釋放),不就永遠佔據記憶體了嗎? 那不就是 stack memory了
B19 並且 new 出來的空間不是不能用free函示嗎?
匿名
這則留言已被刪除
已經刪除的內容就像 Dcard 一樣,錯過是無法再相見的!
B22 既然 new 出來後 delete 不能釋放空間,那 delete 意何在? 我有點搞不懂你打的 free 是指 free 函式還是 形容詞 free…,包括 B12 交大打的解釋。
國立清華大學
B23 關於 delete 請看B13 他解釋得蠻清楚的啊 free 是 free memory,動詞
B24 那我就懂 B12 的意思了,delete 相對還是釋放了記憶體空間呀,因為可以再重新使用,只是沒把內容初始化而已,所以再次使用那個位置時(若 new 沒初始化),會有 garbage 而已。
國立交通大學
Delete/new C++用法 Malloc/free C用法 概念都差不多 Delete/free是把記憶體的位置標示成可回收 你之後還是能存取這些空間 只是結果會是什麼沒人知道,也不建議這樣做 可回收的空間在之後的Malloc/new中可以再重複使用 如果還是沒辦法懂的話就去看YouTube影片 人家會實際操作給你看 至少有例子看得比較懂
匿名
這則留言已被刪除
已經刪除的內容就像 Dcard 一樣,錯過是無法再相見的!
B26 B27 這我就懂了,那有能真正釋放記憶體的函式嗎? 我記得 free() 也只是標記可回收而已,所以才會有 calloc()來多一個初始化動作。
國立交通大學
B28 真正回收記憶體的細節我就不清楚了 這你能自己用英文去查 不過C++初始化都用constructor,只要搭配new就能做到你說的初始化
B29 看起來是沒有真正釋放用的函式,查起來也蠻好笑的 “C++ function that really frees the memory”😂,只會出現 free() 而已
國立清華大學
B28 覺得解釋得不太好@@ 先刪 B27
國立清華大學
覺得把兩件事混為一談了... 重新回一下 delete ptr 寫成 delete [] ptr 才是在講 memory leak 的問題 delete 雖然沒 zero out 過去 new 後的值 但是被標示可使用 所以實際上就是釋放了
B32 這概念我了解,跟 malloc 差不多。 我決定去誠品一趟,看看書上怎麼說,因為 new 使用的 memory 不一定是 heap,上面文章也說是瞎咪 Free Store,想要知道原理(●°u°●)​ 」
B32 印象中我記得沒有可以 zero out 的釋放函式,所以記憶體位置一但被用過就是二手貨 哈哈
國立交通大學
難得在 dcard 上看到像是真正大學生發表的文章 LOL
加州大學河濱分校 資工
最大的差別是會不會拋exception
卡內基美隆大學 電機工程學系
這樓水準很夠
國立臺灣大學
B33 C++ International Standard 沒有規範 memory mangement 的實作方式 compiler 可以有不同的實作細節來決定 static memory allocation 和 dynamic memory allocation 不一定是heap, stack 這種 data structure 而standard 裡的 free store 則是有規定了一些 allocation function 和 deallocation function的性質 有興趣可以去翻翻規格書