Apa perbedaan antara new/ deletedan malloc/ free?
Terkait (duplikat?): Dalam kasus apa saya menggunakan malloc vs baru?
Apa perbedaan antara new/ deletedan 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.
newOperator 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 newoperator mengalokasikan memori kemudian memanggil konstruktor, dan deletememanggil destruktor kemudian membatalkan alokasi memori.
newmemanggil ctor objek, deletememanggil dtor.
malloc& freecukup alokasikan dan lepaskan memori mentah.
new/ deleteadalah C ++, malloc/free berasal dari C. tua yang baik
Dalam C ++, newmemanggil konstruktor objek dandelete memanggil destruktor.
mallocdan free, datang dari zaman kegelapan sebelum OO, hanya mengalokasikan dan membebaskan memori, tanpa mengeksekusi kode objek apa pun.
Satu-satunya kesamaan adalah bahwa malloc/ newkeduanya 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/ deletemelakukan pekerjaan lain yang sewenang-wenang di samping itu, melalui konstruktor, destructors dan operator overloading. mallocSaya freehanya mengalokasikan dan membebaskan memori.
Bahkan, newcukup dapat disesuaikan sehingga tidak selalu mengembalikan memori dari tumpukan, atau bahkan mengalokasikan memori sama sekali. Namun standarnya newtidak.
Perbedaan utama antara baru dan malloc adalah bahwa baru memanggil konstruktor objek dan panggilan yang sesuai untuk menghapus memanggil destruktor objek.
Ada perbedaan lain:
newadalah tipe-aman, mallocmengembalikan objek tipevoid*
newmelempar pengecualian pada kesalahan, mallocmengembalikan NULLdan menetapkan errno
newadalah operator dan dapat kelebihan beban, mallocadalah fungsi dan tidak dapat kelebihan beban
new[], yang mengalokasikan array, lebih intuitif dan lebih aman daripada malloc
mallocAlokasi yang diterima dapat diubah ukurannya melalui realloc, newalokasi yang diterima tidak dapat diubah ukurannya
mallocdapat mengalokasikan sepotong memori N-byte, newharus diminta untuk mengalokasikan array, katakanlah, charjenis
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 newtidak yang malloctidak:
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, newbisa kelebihan beban tetapi malloctidak bisa.
Singkatnya, jika Anda menggunakan C ++, coba gunakan newsebanyak mungkin.
newdan deleteadalah primitif C ++ yang mendeklarasikan instance baru dari suatu kelas atau menghapusnya (dengan demikian memanggil destruktor kelas untuk instance).
mallocdan freemerupakan fungsi C dan mereka mengalokasikan dan membebaskan blok memori (dalam ukuran).
Keduanya menggunakan heap untuk melakukan alokasi. mallocdan freemeskipun 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 .newdan deletebisa kelebihan beban tetapi malloctidak bisa.new, kami dapat meneruskan alamat tempat kami ingin mengalokasikan memori tetapi ini tidak mungkin dilakukan jika terjadi malloc.alloc.hbukan 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.