Bahaya Memadamkan Penunjuk Kekosongan
Dalam C , pengurusan memori adalah penting, dan memahami penggunaan penunjuk yang betul adalah yang paling penting. Soalan biasa timbul apabila berurusan dengan penunjuk tidak sah: adakah selamat untuk memadamkan penunjuk tidak sah secara langsung?
Soalan:
Pertimbangkan kod berikut:
void *my_alloc(size_t size) { return new char[size]; } void my_free(void *ptr) { delete[] ptr; }
Adakah kod ini selamat atau mesti ptr dihantar ke char* sebelum ini pemadaman?
Jawapan:
Memadamkan penunjuk tidak sah secara jelas dilarang oleh Piawaian C. Bahagian 5.3.5/3 menyatakan bahawa:
In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.
Ini bermakna pemadaman objek menggunakan penunjuk lompang tidak ditentukan kerana tiada objek jenis lompang.
Dalam istilah yang lebih mudah, a void pointer tidak mempunyai maklumat jenis, jadi ia tidak boleh mengandungi maklumat yang diperlukan untuk memadamkan memori yang diperuntukkan dengan betul. Pemadaman melalui penuding kosong boleh merosakkan timbunan memori dan membawa kepada tingkah laku yang tidak dapat diramalkan atau ranap program.
Oleh itu, adalah penting untuk mengelakkan pemadaman melalui penunjuk tidak sah dan sebaliknya menghantar penunjuk tidak sah kepada jenis yang sesuai sebelum pemadaman. Dalam contoh yang diberikan, adalah perlu untuk menghantar ptr ke char* sebelum memanggil padam[]:
void my_free(void *ptr) { delete[] static_cast<char*>(ptr); }
Dengan mengikuti amalan ini, anda memastikan bahawa memori diagihkan dengan betul, mengelakkan kemungkinan ralat dan mengekalkan integriti program anda.
Atas ialah kandungan terperinci Adakah Selamat untuk Memadamkan Penunjuk Kekosongan Terus dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!