Apa perbedaan antara delete
dan delete[]
operator di C ++?
c++
memory-management
delete-operator
shreyasva
sumber
sumber
vector<>
bukannya array kapan pun saya bisa.std::unique_ptr<int>(new int[3])
, karena akan memanggil regulerdelete
pada array yang merupakan perilaku yang tidak terdefinisi. Sebagai gantinya Anda perlu menggunakanstd::unique_ptr<int[]>
Jawaban:
The
delete
Operator deallocates memori dan memanggil destructor untuk satu objek yang dibuat dengannew
.The
delete []
Operator deallocates memori dan panggilan destructors untuk array obyek dibuat dengannew []
.Menggunakan
delete
pada pointer yang dikembalikan olehnew []
ataudelete []
pada pointer yang dikembalikan olehnew
hasil dalam perilaku yang tidak ditentukan.sumber
The
delete[]
operator yang digunakan untuk array hapus. Thedelete
operator yang digunakan untuk menghapus objek non-array. Itu panggilanoperator delete[]
danoperator delete
fungsi masing-masing untuk menghapus memori bahwa array atau objek non-array ditempati setelah (akhirnya) memanggil destruktor untuk elemen-elemen array atau objek non-array.Berikut ini menunjukkan hubungan:
Untuk
new
yang menciptakan array (jadi, apakah itunew type[]
ataunew
diterapkan pada konstruksi tipe array), Standar mencari sebuahoperator new[]
di kelas tipe elemen array atau dalam lingkup global, dan melewati jumlah memori yang diminta. Mungkin meminta lebih dariN * sizeof(ElementType)
jika ia ingin (misalnya untuk menyimpan jumlah elemen, jadi nanti ketika menghapus tahu berapa banyak panggilan destruktor yang harus dilakukan). Jika kelas menyatakanoperator new[]
bahwa tambahan untuk jumlah memori menerima yang lainsize_t
, parameter kedua itu akan menerima jumlah elemen yang dialokasikan - ia dapat menggunakan ini untuk tujuan apa pun yang diinginkan (debugging, dll ...).Untuk
new
yang membuat objek non-array, ia akan mencarioperator new
di dalam elemen elemen atau dalam lingkup global. Itu melewati jumlah memori yang diminta (sizeof(T)
selalu selalu).Untuk
delete[]
itu, ia melihat ke tipe kelas elemen array dan memanggil destruktor mereka. Theoperator delete[]
fungsi yang digunakan adalah satu di kelas jenis elemen, atau jika tidak ada maka dalam lingkup global.Untuk
delete
, jika pointer yang lewat adalah kelas dasar dari jenis objek yang sebenarnya, kelas dasar harus memiliki destruktor virtual (jika tidak, perilaku tidak terdefinisi). Jika itu bukan kelas dasar, maka destruktor dari kelas itu disebut, danoperator delete
di kelas itu atau globaloperator delete
digunakan. Jika kelas dasar disahkan, maka destruktor tipe objek aktual disebut, danoperator delete
ditemukan di kelas itu digunakan, atau jika tidak ada, globaloperator delete
disebut. Jikaoperator delete
di dalam kelas memiliki parameter tipe keduasize_t
, ia akan menerima jumlah elemen untuk dialokasikan ulang.sumber
Ini penggunaan dasar pola mengalokasikan / DE mengalokasikan dalam c ++
malloc
/free
,new
/delete
,new[]
/delete[]
Kita harus menggunakannya secara bersamaan. Tetapi saya ingin menambahkan pemahaman khusus ini untuk perbedaan antara
delete
dandelete[]
1)
delete
digunakan untuk mengalokasikan memori yang dialokasikan untuk objek tunggal2)
delete[]
digunakan untuk mengalokasikan memori yang dialokasikan untuk berbagai objekketika kita mengatakan
new ABC[100]
, compiler dapat memperoleh informasi tentang berapa banyak objek yang perlu dialokasikan (ini adalah 100) dan akan memanggil konstruktor untuk setiap objek yang dibuattetapi sesuai dengan itu jika kita hanya menggunakan
delete ptr
untuk kasus ini, kompiler tidak akan tahu berapa banyak objek yangptr
menunjuk dan akan berakhir memanggil destruktor dan menghapus memori hanya untuk 1 objek (meninggalkan permintaan destruktor dan deallokasi 99 objek yang tersisa). Karenanya akan ada kebocoran memori.jadi kita perlu menggunakan
delete [] ptr
dalam hal ini.sumber
free()
ini dan itu. Jika Anda menggunakan pola pseudo-destructor, Anda harus memanggilnya sekali untuk setiap objek menggunakanfor
loop.Operator
delete
dandelete []
digunakan masing-masing untuk menghancurkan objek yang dibuat dengannew
dannew[]
, kembali ke memori yang dialokasikan tersisa yang tersedia untuk manajer memori kompiler.Objek yang dibuat dengan
new
harus dihancurkandelete
, dan array yang dibuat dengan itunew[]
harus dihapusdelete[]
.sumber
Ketika saya mengajukan pertanyaan ini, pertanyaan saya yang sebenarnya adalah, "apakah ada perbedaan di antara keduanya? Tidakkah runtime harus menyimpan informasi tentang ukuran array, dan apakah itu tidak dapat menentukan yang mana yang kami maksud?" Pertanyaan ini tidak muncul dalam "pertanyaan terkait", jadi hanya untuk membantu orang-orang seperti saya, inilah jawabannya: "mengapa kita bahkan perlu operator hapus []?"
sumber
delete
digunakan untuk satu pointer tunggal dandelete[]
digunakan untuk menghapus array melalui sebuah pointer. Ini mungkin membantu Anda untuk memahami dengan lebih baik.sumber
Yah .. mungkin saya pikir itu hanya untuk eksplisit. Operator
delete
dan operatordelete[]
dibedakan tetapidelete
operator dapat melepaskan array juga.Dan sudah diperiksa kode ini tidak ada kebocoran memeory.
sumber