Rumah >pembangunan bahagian belakang >C++ >Adakah Memadam Penunjuk `void*` dengan `delete[]` Selamat dalam C ?

Adakah Memadam Penunjuk `void*` dengan `delete[]` Selamat dalam C ?

DDD
DDDasal
2024-12-05 15:00:18933semak imbas

Is Deleting a `void*` Pointer with `delete[]` Safe in C  ?

Memadamkan Penunjuk Tidak Sah: Penilaian Keselamatan

Pertimbangkan coretan kod berikut:

void* my_alloc(size_t size) {
  return new char[size];
}

void my_free(void* ptr) {
  delete[] ptr;
}

Adakah selamat untuk memadamkan penunjuk yang diperuntukkan sebagai batal* menggunakan padam[] operator?

Jawapan:

Memadamkan penunjuk melalui kekosongan* tidak ditakrifkan 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 itu tidak ditentukan.

Selain itu, nota kaki mencatatkan:

Ini membayangkan bahawa objek tidak boleh dipadam menggunakan penunjuk jenis void* kerana tiada objek jenis batal.

Kesimpulan:

Adalah tidak selamat untuk memadamkan penunjuk yang diperuntukkan sebagai kekosongan* menggunakan pengendali padam[]. Sentiasa hantar penuding kepada jenis asalnya sebelum pemadaman.

Atas ialah kandungan terperinci Adakah Memadam Penunjuk `void*` dengan `delete[]` Selamat 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