Apa perbedaan antara new
/ delete
dan malloc
/ free
?
Terkait (duplikat?): Dalam kasus apa saya menggunakan malloc vs baru?
Apa perbedaan antara new
/ delete
dan malloc
/ free
?
Terkait (duplikat?): Dalam kasus apa saya menggunakan malloc vs baru?
Jawaban:
Tabel perbandingan fitur:
Feature | new/delete | malloc/free
--------------------------+--------------------------------+-------------------------------
Memory allocated from | 'Free Store' | 'Heap'
Returns | Fully typed pointer | void*
On failure | Throws (never returns NULL) | Returns NULL
Required size | Calculated by compiler | Must be specified in bytes
Handling arrays | Has an explicit version | Requires manual calculations
Reallocating | Not handled intuitively | Simple (no copy constructor)
Call of reverse | Implementation defined | No
Low memory cases | Can add a new memory allocator | Not handled by user code
Overridable | Yes | No
Use of (con-)/destructor | Yes | No
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.
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, dan delete
memanggil destruktor kemudian membatalkan alokasi memori.
new
memanggil ctor objek, delete
memanggil dtor.
malloc
& free
cukup alokasikan dan lepaskan memori mentah.
new
/ delete
adalah C ++, malloc
/free
berasal dari C. tua yang baik
Dalam C ++, new
memanggil konstruktor objek dandelete
memanggil destruktor.
malloc
dan free
, datang dari zaman kegelapan sebelum OO, hanya mengalokasikan dan membebaskan memori, tanpa mengeksekusi kode objek apa pun.
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
Saya free
hanya mengalokasikan dan membebaskan memori.
Bahkan, new
cukup dapat disesuaikan sehingga tidak selalu mengembalikan memori dari tumpukan, atau bahkan mengalokasikan memori sama sekali. Namun standarnya new
tidak.
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
mengembalikan NULL
dan menetapkan errno
new
adalah operator dan dapat kelebihan beban, malloc
adalah fungsi dan tidak dapat kelebihan beban
new[]
, yang mengalokasikan array, lebih intuitif dan lebih aman daripada malloc
malloc
Alokasi yang diterima dapat diubah ukurannya melalui realloc
, new
alokasi yang diterima tidak dapat diubah ukurannya
malloc
dapat mengalokasikan sepotong memori N-byte, new
harus diminta untuk mengalokasikan array, katakanlah, char
jenis
Melihat 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.
Ada beberapa hal yang new
tidak yang malloc
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 tetapi malloc
tidak bisa.
Singkatnya, jika Anda menggunakan C ++, coba gunakan new
sebanyak mungkin.
new
dan delete
adalah primitif C ++ yang mendeklarasikan instance baru dari suatu kelas atau menghapusnya (dengan demikian memanggil destruktor kelas untuk instance).
malloc
dan free
merupakan fungsi C dan mereka mengalokasikan dan membebaskan blok memori (dalam ukuran).
Keduanya menggunakan heap untuk melakukan alokasi. malloc
dan free
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).
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.
malloc()
, kita perlu memasukkan <stdlib.h>
atau
<alloc.h>
dalam program yang tidak diperlukannew
.new
dan delete
bisa kelebihan beban tetapi malloc
tidak bisa.new
, kami dapat meneruskan alamat tempat kami ingin mengalokasikan memori tetapi ini tidak mungkin dilakukan jika terjadi malloc
.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:
#include<iostream>
using namespace std;
class ABC{
public: ABC(){
cout<<"Hello"<<endl;
}
void disp(){
cout<<"Hi\n";
}
};
int main(){
ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();
cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}
keluaran:
Hello Hi 0x2abfef37cc20
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.