Pertimbangkan coretan kod berikut:
void* my_alloc(size_t size) { return new char[size]; } void my_free(void* ptr) { delete[] ptr; }
Persoalannya timbul: adakah ia selamat digunakan my_free untuk memadam penunjuk yang diperuntukkan oleh my_alloc, memandangkan my_alloc mengembalikan void*?
Jawapannya ialah "tidak." Memadam melalui kekosongan* adalah dilarang secara jelas oleh Piawaian C. Bahagian 5.3.5/3 menyatakan:
Dalam alternatif pertama (padam objek), jika jenis statik operan berbeza daripada jenis dinamiknya, jenis statik hendaklah menjadi kelas asas bagi jenis dinamik operan. dan jenis statik hendaklah mempunyai pemusnah maya atau tingkah laku tidak ditentukan. Dalam alternatif kedua (tatasusunan padam) jika jenis dinamik objek yang akan dipadamkan berbeza daripada jenis statiknya, tingkah laku tidak ditentukan.
Dan nota kakinya menambah:
Ini membayangkan bahawa objek tidak boleh dipadam menggunakan penunjuk jenis void* kerana tiada objek jenis void
Memadam melalui kekosongan* boleh membawa kepada akibat yang tidak dapat diramalkan dan malapetaka. Atur cara mungkin ranap memori, data rosak atau menghasilkan keputusan yang salah.
Oleh itu, adalah penting untuk sentiasa menghantar penuding kepada jenis yang betul sebelum memadamkannya. Dalam kes ini, penuding hendaklah dihantar ke char* sebelum menghantarnya untuk memadam[].
Atas ialah kandungan terperinci Adakah Selamat Memadam Memori yang Diperuntukkan melalui `void*` dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!