Apa perbedaan antara new
/ delete
dan malloc
/ free
?
Terkait (duplikat?): Dalam kasus apa saya menggunakan malloc vs baru?
c++
memory-management
MrDatabase
sumber
sumber
Jawaban:
baru / hapus
malloc / gratis
Tabel perbandingan fitur:
Secara teknis, memori yang dialokasikan oleh yang baru berasal dari 'Free Store' sedangkan memori yang dialokasikan oleh malloc berasal dari 'Heap'. Apakah kedua area ini sama adalah detail implementasi, yang merupakan alasan lain mengapa malloc dan baru tidak dapat dicampur.
sumber
If ptr is NULL, no operation is performed.
new
Operator mengalokasikan memori dari toko gratis (juga dikenal sebagai memori dinamis) dan heap ) .C ++ 14 Standar, bagian 3.7.4 tentang Penyimpanan Dinamis mengatakan "Objek dapat dibuat secara dinamis selama eksekusi program (1.9), menggunakan ekspresi baru (5.3.4), dan dimusnahkan menggunakan delete-expressions."Perbedaan yang paling relevan adalah bahwa
new
operator mengalokasikan memori kemudian memanggil konstruktor, dandelete
memanggil destruktor kemudian membatalkan alokasi memori.sumber
new
memanggil ctor objek,delete
memanggil dtor.malloc
&free
cukup alokasikan dan lepaskan memori mentah.sumber
new
/delete
adalah C ++,malloc
/free
berasal dari C. tua yang baikDalam C ++,
new
memanggil konstruktor objek dandelete
memanggil destruktor.malloc
danfree
, datang dari zaman kegelapan sebelum OO, hanya mengalokasikan dan membebaskan memori, tanpa mengeksekusi kode objek apa pun.sumber
Dalam C ++
new
/delete
panggil Konstruktor / Destructor sesuai.malloc
Sayafree
cukup mengalokasikan memori dari heap.new
Saya jugadelete
mengalokasikan memori.sumber
Satu-satunya kesamaan adalah bahwa
malloc
/new
keduanya mengembalikan pointer yang membahas beberapa memori pada heap, dan mereka berdua menjamin bahwa begitu blok memori telah dikembalikan, itu tidak akan dikembalikan lagi kecuali Anda membebaskan / menghapusnya terlebih dahulu. Artinya, mereka berdua "mengalokasikan" memori.Namun,
new
/delete
melakukan pekerjaan lain yang sewenang-wenang di samping itu, melalui konstruktor, destructors dan operator overloading.malloc
Sayafree
hanya mengalokasikan dan membebaskan memori.Bahkan,
new
cukup dapat disesuaikan sehingga tidak selalu mengembalikan memori dari tumpukan, atau bahkan mengalokasikan memori sama sekali. Namun standarnyanew
tidak.sumber
Perbedaan utama antara baru dan malloc adalah bahwa baru memanggil konstruktor objek dan panggilan yang sesuai untuk menghapus memanggil destruktor objek.
Ada perbedaan lain:
new
adalah tipe-aman,malloc
mengembalikan objek tipevoid*
new
melempar pengecualian pada kesalahan,malloc
mengembalikanNULL
dan menetapkan errnonew
adalah operator dan dapat kelebihan beban,malloc
adalah fungsi dan tidak dapat kelebihan bebannew[]
, yang mengalokasikan array, lebih intuitif dan lebih aman daripadamalloc
malloc
Alokasi yang diterima dapat diubah ukurannya melaluirealloc
,new
alokasi yang diterima tidak dapat diubah ukurannyamalloc
dapat mengalokasikan sepotong memori N-byte,new
harus diminta untuk mengalokasikan array, katakanlah,char
jenisMelihat perbedaannya, ringkasannya adalah malloc adalah C-esque, baru adalah C ++ - esque. Gunakan yang terasa tepat untuk basis kode Anda.
Walaupun legal dan baru untuk malloc diimplementasikan menggunakan algoritma alokasi memori yang berbeda, pada kebanyakan sistem baru diimplementasikan secara internal menggunakan malloc, tidak menghasilkan perbedaan level sistem.
sumber
Ada beberapa hal yang
new
tidak yangmalloc
tidak:new
membangun objek dengan memanggil konstruktor objek itunew
tidak memerlukan typecasting memori yang dialokasikan.Jadi, jika Anda menggunakan
malloc
, maka Anda perlu melakukan hal-hal di atas secara eksplisit, yang tidak selalu praktis. Selain itu,new
bisa kelebihan beban tetapimalloc
tidak bisa.Singkatnya, jika Anda menggunakan C ++, coba gunakan
new
sebanyak mungkin.sumber
juga,
global baru dan hapus dapat ditimpa, malloc / gratis tidak bisa.
selanjutnya lebih baru dan hapus dapat diganti per jenis.
sumber
new
dandelete
adalah primitif C ++ yang mendeklarasikan instance baru dari suatu kelas atau menghapusnya (dengan demikian memanggil destruktor kelas untuk instance).malloc
danfree
merupakan fungsi C dan mereka mengalokasikan dan membebaskan blok memori (dalam ukuran).Keduanya menggunakan heap untuk melakukan alokasi.
malloc
danfree
meskipun demikian lebih "tingkat rendah" karena mereka hanya memesan sepotong ruang memori yang mungkin akan dikaitkan dengan pointer. Tidak ada struktur yang dibuat di sekitar memori itu (kecuali Anda menganggap array C sebagai struktur).sumber
baru dan hapus adalah operator di c ++; yang bisa kelebihan beban juga. malloc dan bebas adalah fungsi dalam c;
malloc mengembalikan null ptr ketika gagal saat pengecualian melempar baru.
alamat yang dikembalikan oleh malloc perlu dengan jenis dicor lagi karena mengembalikan (void *) malloc (ukuran) Baru mengembalikan pointer yang diketik.
sumber
sumber
malloc()
, kita perlu memasukkan<stdlib.h>
atau<alloc.h>
dalam program yang tidak diperlukannew
.new
dandelete
bisa kelebihan beban tetapimalloc
tidak bisa.new
, kami dapat meneruskan alamat tempat kami ingin mengalokasikan memori tetapi ini tidak mungkin dilakukan jika terjadimalloc
.sumber
alloc.h
bukan header standar.<new>
diperlukan untuk menggunakan penempatan baru.Kode ini untuk penggunaan menghapus kata kunci atau fungsi gratis. Tetapi ketika membuat objek pointer menggunakan 'malloc' atau 'baru' dan membatalkan alokasi objek memori menggunakan delete bahkan bahwa pointer objek dapat menjadi fungsi panggilan di kelas. Setelah itu gunakan bebas alih-alih hapus kemudian juga berfungsi setelah pernyataan bebas, tetapi ketika menggunakan keduanya maka hanya objek pointer yang tidak dapat memanggil untuk berfungsi di kelas .. kodenya adalah sebagai berikut:
sumber
1. syntex baru lebih sederhana dari pada malloc ()
2.new/delete adalah operator di mana malloc () / free () adalah sebuah fungsi.
3.new/delete mengeksekusi lebih cepat daripada malloc () / free () karena kode assemly baru langsung disisipkan oleh kompiler.
4.kita dapat mengubah makna baru / hapus dalam program dengan bantuan operator overlading.
sumber