Apa perbedaan antara new / delete dan malloc / gratis?

Jawaban:

465

baru / hapus

  • Alokasikan / lepaskan memori
    1. Memori yang dialokasikan dari 'Free Store'
    2. Mengembalikan pointer yang diketik sepenuhnya.
    3. baru (versi standar) tidak pernah mengembalikan NULL (akan gagal)
    4. Disebut dengan Type-ID (compiler menghitung ukuran)
    5. Memiliki versi secara eksplisit untuk menangani array.
    6. Realokasi (untuk mendapatkan lebih banyak ruang) tidak ditangani secara intuitif (karena copy constructor).
    7. Apakah mereka menyebut malloc / gratis adalah implementasi yang ditentukan.
    8. Dapat menambahkan pengalokasi memori baru untuk menangani memori rendah (set_new_handler)
    9. operator baru / hapus dapat diganti secara hukum
    10. constructor / destructor digunakan untuk menginisialisasi / menghancurkan objek

malloc / gratis

  • Alokasikan / lepaskan memori
    1. Memori yang dialokasikan dari 'Heap'
    2. Menghasilkan kekosongan *
    3. Mengembalikan NULL saat gagal
    4. Harus menentukan ukuran yang diperlukan dalam byte.
    5. Mengalokasikan array membutuhkan perhitungan ruang secara manual.
    6. Alokasi ulang potongan memori yang lebih besar sederhana (Tidak ada copy constructor yang perlu dikhawatirkan)
    7. Mereka TIDAK akan memanggil yang baru / hapus
    8. Tidak ada cara untuk memisahkan kode pengguna ke dalam urutan alokasi untuk membantu dengan memori rendah.
    9. malloc / gratis TIDAK bisa diganti secara hukum

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.

Martin York
sumber
12
Adakah yang bisa diedit untuk menjelaskan tentang "Toko Bebas" yang bertentangan dengan heap? Tumpukan proses adalah konsep tingkat sistem operasi yang dikenal dengan bahasa independen (?); dari mana "Toko Bebas" berasal?
einpoklum
1
@einpoklum: Itu hanya nama area memori. Tidak ada hubungannya dengan konsep bahasa yang dikenal sebagai "tumpukan" atau konsep os "proses tumpukan". C ++ sengaja didefinisikan sebagai Platform / OS / Compiler netral. Jadi menggunakan konsep OS tertentu seperti "proses tumpukan" akan merusak fleksibilitas standar.
Martin York
4
@winterlight: Itu dulu benar tetapi tidak lagi. Lihat: linux.die.net/man/3/free If ptr is NULL, no operation is performed.
Martin York
2
@LokiAstari Itu terlihat seperti 'heap', 'free store', dan 'dynamic memory / storage' adalah sinonim: Dalam A Tour of C ++ dari Bjarne Stroustrup , ia mengatakan " 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."
Max Heiber
2
@mheiber: Artinya mereka bisa sama. Dan beberapa implementasi mengimplementasikan baru dengan memanggil malloc (perhatikan sebaliknya tidak diizinkan). Tetapi beberapa implementasi membuat area memori tersebut benar-benar terpisah. Alasannya membuat mereka terpisah adalah karena ini memungkinkan kode manajemen memori C ++ dioptimalkan dengan cara yang berbeda dari manajemen memori C. Intinya adalah: Mereka mungkin sama tetapi Anda tidak dapat berasumsi bahwa mereka memang sama.
Martin York
81

Perbedaan yang paling relevan adalah bahwa newoperator mengalokasikan memori kemudian memanggil konstruktor, dan deletememanggil destruktor kemudian membatalkan alokasi memori.

Perangkap
sumber
22
Sebenarnya, operator baru hanya mengalokasikan memori. Ini adalah ekspresi baru yang memanggil operator baru, lalu menjalankan konstruktor dalam memori yang dialokasikan.
Don Wakefield
Perbedaan lainnya adalah di mana memori dialokasikan. Baru-baru ini saya melihat bahwa malloc / free beroperasi di heap, sementara yang baru / delete beroperasi di area memori lain yang namanya luput dari saya sekarang. (Namun, cukuplah untuk mengatakan bahwa daerah lain mungkin dapat dianggap sebagai tumpukan lainnya.)
RobH
2
@ mgb: Ya, Anda benar bahwa objek dialokasikan pada "tumpukan Aplikasi" atau tumpukan. Tetapi @RobH mengacu pada apa yang standar sebut bagian berbeda dari "Application Heap". Ada "Heap" yang merupakan tempat malloc mengalokasikan memori dari dan "Free Store" tempat baru mengalokasikan memori. Meskipun dalam beberapa implementasi area ini tumpang tindih (ini adalah detail implementasi).
Martin York
1
Pernyataan Anda 100% benar tetapi tidak menjawab pertanyaan yang diajukan, lihat jawaban di bawah, ada alasan mengapa lebih banyak suara daripada milik Anda.
Murali
1
Yang saya coba katakan adalah harus ada setidaknya beberapa menyebutkan malloc / gratis agar memenuhi syarat sebagai perbandingan yang kurang jawaban Anda. Namun demikian, ini adalah pernyataan yang relevan dan akurat, jadi upvotes, saya harap Anda mengerti maksud saya. Ngomong-ngomong, kalau saja SO mengizinkan saya untuk mengambil kembali downvote saya, saya akan sepenuh hati.
Murali
30

newmemanggil ctor objek, deletememanggil dtor.

malloc& freecukup alokasikan dan lepaskan memori mentah.

James Curran
sumber
Apa yang Anda maksud dengan memori mentah?
Destructor
3
Memori mentah tidak ada yang dilakukan untuk itu. Belum ada objek yang dibuat di dalamnya, belum ada yang disalin ke dalamnya, dan dalam kebanyakan kasus, konten sebelumnya belum ditimpa.
James Curran
14

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.

Treb
sumber
9
"Datang dari zaman kegelapan sebelum OO" terdengar seperti Anda menyiratkan bahwa / delete baru lebih baik daripada malloc / gratis ketika dalam kenyataannya, tidak ada yang lebih baik atau lebih buruk, mereka hanya memiliki kegunaan yang berbeda. Perhatikan bahwa saya bukan satu-satunya yang menurunkan Anda, saya hanya menebak.
Graeme Perrow
13

Dalam C ++ new/ deletepanggil Konstruktor / Destructor sesuai.

mallocSaya freecukup mengalokasikan memori dari heap. newSaya juga deletemengalokasikan memori.

Enkripsi
sumber
10

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.

Steve Jessop
sumber
7

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.

Walter
sumber
5

Ada beberapa hal yang newtidak yang malloctidak:

  1. new membangun objek dengan memanggil konstruktor objek itu
  2. new tidak memerlukan typecasting memori yang dialokasikan.
  3. Itu tidak memerlukan sejumlah memori untuk dialokasikan, melainkan membutuhkan sejumlah objek yang akan dibangun.

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.

herohuyongtao
sumber
4

juga,

global baru dan hapus dapat ditimpa, malloc / gratis tidak bisa.

selanjutnya lebih baru dan hapus dapat diganti per jenis.

DanJ
sumber
3

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).

Jorge Córdoba
sumber
1
baru di C ++ tidak mendeklarasikan instance kelas. Itu (biasanya) mengalokasikan satu dari heap, dan tidak menyatakan apapun. Anda dapat mendeklarasikan instance hanya dengan mendeklarasikannya, dalam hal ini ia akan berada di stack, atau di global, tergantung pada durasi penyimpanan dari deklarasi tersebut.
Steve Jessop
Yah, itu mengalokasikan ruang memori untuk kelas tetapi Anda tidak bisa "mendeklarasikan" kelas di stack, bukan dalam arti sebenarnya menyimpan kelas di stack. Deklarasi hanya melibatkan pointer ke kelas yang selalu dialokasikan di stack memori aktual memegang kelas di heap.
Jorge Córdoba
Ya kamu bisa. Menurut tag pertanyaan, ini adalah C ++, jadi objek bisa masuk stack. Dan yang baru bukan deklarasi, itu ekspresi. Mendeklarasikan sesuatu dan mengalokasikannya adalah hal-hal yang terpisah.
Steve Jessop
2

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.

VishalTiwari
sumber
2
  • baru adalah operator, sedangkan malloc () adalah fucntion.
  • baru mengembalikan tipe data yang tepat, sedangkan malloc () mengembalikan void * (pointer tipe void).
  • malloc (), memori tidak diinisialisasi dan nilai default adalah sampah, sedangkan dalam kasus baru, memori diinisialisasi dengan nilai default, seperti dengan 'nol (0)' dalam kasus di int.
  • hapus dan gratis () keduanya dapat digunakan untuk pointer 'NULL'.
Anurag Singh
sumber
0
  • Untuk menggunakan malloc(), kita perlu memasukkan <stdlib.h> atau <alloc.h>dalam program yang tidak diperlukannew .
  • newdan deletebisa kelebihan beban tetapi malloctidak bisa.
  • Dengan menggunakan penempatan new, kami dapat meneruskan alamat tempat kami ingin mengalokasikan memori tetapi ini tidak mungkin dilakukan jika terjadi malloc.
ron davis
sumber
1
alloc.hbukan header standar. <new>diperlukan untuk menggunakan penempatan baru.
MM
0

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
chirag kadam
sumber
-3

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.

Nitesh
sumber