Rumah >pembangunan bahagian belakang >C++ >Adakah Selamat Memadam Memori yang Diperuntukkan melalui `void*` dalam C ?

Adakah Selamat Memadam Memori yang Diperuntukkan melalui `void*` dalam C ?

DDD
DDDasal
2024-12-06 13:55:111053semak imbas

Is it Safe to Delete Memory Allocated via `void*` in C  ?

Bahaya Memadam Melalui Penunjuk Void dalam C

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*?

Tingkah Laku Tidak Ditakrifkan

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

Akibat

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn