Secara teoritis saya bisa mengatakan itu
free(ptr);
free(ptr);
adalah kerusakan memori karena kita membebaskan memori yang telah dibebaskan.
Tapi bagaimana jika
free(ptr);
ptr=NULL;
free(ptr);
Karena OS akan berperilaku dengan cara yang tidak ditentukan, saya tidak bisa mendapatkan analisis teoritis aktual untuk ini tentang apa yang terjadi. Apapun yang saya lakukan, apakah ingatan ini rusak atau tidak?
Apakah membebaskan pointer NULL valid?
delete NULL
tidak valid di C ++. delete dapat diterapkan ke nilai null-pointer dari tipe beton, tetapi tidak untukNULL
.delete (int*) NULL
legal, tapi tidakdelete NULL
.ptr
menunjuk ke memori, dan Anda tidak memanggilnyafree
, maka memori tersebut akan bocor. Menyetelnya menjadiNULL
hanya kehilangan pegangan pada memori, dan kebocoran. Jikaptr
kebetulanNULL
, panggilanfree
adalah tidak ada operasi.free(ptr)
denganptr = NULL
. Tidak ada yang mengatakan hal seperti itu.Jawaban:
Lihat ISO-IEC 9899 .
Meskipun demikian, saat melihat basis kode yang berbeda di alam liar, Anda terkadang akan melihat orang melakukan:
Ini karena beberapa runtime C (saya pasti ingat itu yang terjadi di PalmOS) akan macet saat membebaskan
NULL
pointer.Tapi saat ini, saya yakin aman untuk berasumsi
free(NULL)
adalah nop sesuai instruksi standar.sumber
free(ptr)
manaptr
nol tidak memiliki efek samping. Tapi bagaimanapun, setiap memori yang dialokasikan menggunakanmalloc()
ataucalloc()
harus dilepaskan setelahnya menggunakanfree()
free(NULL)
dengan menguji pointer terhadapNULL
sebelum meneleponfree()
Semua versi library C yang memenuhi standar memperlakukan free (NULL) sebagai no-op.
Yang mengatakan, pada suatu waktu ada beberapa versi gratis yang akan mogok pada gratis (NULL) itulah sebabnya Anda mungkin melihat beberapa teknik pemrograman defensif merekomendasikan:
sumber
kata dokumentasinya.
sumber
Saya ingat bekerja di PalmOS yang
free(NULL)
mengalami crash.sumber
NULL
adalah salah satu perbedaan besar dari toolbox Palm dibandingkan dengan perpustakaan standar.Anda dapat dengan aman menghapus penunjuk NULL. Tidak ada operasi yang akan dilakukan dalam kasus itu.Dengan kata lain free () tidak melakukan apa pun pada penunjuk NULL.
sumber
Penggunaan yang direkomendasikan:
Lihat:
Saat Anda mengatur penunjuk ke
NULL
setelahfree()
Anda dapat memanggilnyafree()
lagi dan tidak ada operasi yang akan dilakukan.sumber
free(NULL)
legal di Cdelete (void *)0
dandelete[] (void *)0
juga legal di C ++.BTW, membebaskan memori dua kali biasanya menyebabkan beberapa jenis kesalahan waktu proses, jadi tidak merusak apa pun.
sumber
delete 0
tidak legal di C ++.delete
secara eksplisit membutuhkan ekspresi tipe pointer. Adalah legal untuk menerapkandelete
ke nilai penunjuk null yang diketik, tetapi tidak untuk0
(dan tidak untukNULL
).void*
: P Perusak mana yang harus dijalankan?void *
selama itu adalah null-pointer.buf1=malloc(X); free(buf1);buf2=malloc(X);free(buf1);
- di sini jika Anda tidak beruntung, buf2 mendapat alamat yang sama persis dengan buf1, dan Anda secara tidak sengaja membebaskan buf1 dua kali, jadi pada tanggal 2 bebas buf1 Anda benar-benar membebaskan buf2 secara diam-diam, tanpa casuing setiap kesalahan (segera) / crash / apapun. (tetapi Anda mungkin masih akan mengalami crash saat Anda mencoba menggunakan buf2 - dan skenario ini sangat tidak mungkin jika Anda menjalankan ASLR)free(ptr)
disimpan di C jikaptr
adaNULL
, namun, apa yang kebanyakan orang tidak tahu adalah bahwaNULL
kebutuhannya tidak harus sama dengan 0. Saya punya contoh jadul yang bagus: Di C64, di alamat 0, ada IO-Port. Jika Anda menulis program di C dengan mengakses port ini, Anda memerlukan pointer yang nilainya 0. Library C yang sesuai harus membedakan antara 0 danNULL
kemudian.Salam.
sumber
bukan kerusakan memori, tetapi perilaku bergantung pada implementasi. Secara standar, itu harus menjadi kode hukum.
sumber
ptr menunjuk ke beberapa lokasi memori, katakanlah 0x100.
Ketika Anda membebaskan (ptr), pada dasarnya Anda mengizinkan 0x100 digunakan oleh pengelola memori untuk digunakan untuk aktivitas atau proses lain dan dengan kata sederhana itu adalah deallokasi sumber daya.
Ketika Anda melakukan ptr = NULL, Anda membuat titik ptr ke lokasi baru (jangan khawatir tentang apa itu NULL). Melakukan ini, Anda kehilangan jejak data memori 0x100. Inilah yang disebut kebocoran memori.
Jadi, tidak disarankan untuk menggunakan ptr = NULL pada ptr yang valid.
Sebagai gantinya, Anda dapat melakukan pemeriksaan aman dengan menggunakan:
if (ptr! = NULL) {free (ptr);}
Ketika Anda membebaskan (ptr) di mana ptr sudah mengarah ke NULL, itu tidak melakukan operasi, jadi aman untuk melakukannya.
sumber