Rumah >pembangunan bahagian belakang >C++ >Adakah Selamat untuk Memanggil `padam` pada Pembolehubah Diperuntukkan Tindanan dalam C ?

Adakah Selamat untuk Memanggil `padam` pada Pembolehubah Diperuntukkan Tindanan dalam C ?

Linda Hamilton
Linda Hamiltonasal
2024-12-26 09:06:09907semak imbas

Is it Safe to Call `delete` on a Stack-Allocated Variable in C  ?

Bolehkah Anda Panggil Padam Dengan Selamat pada Pembolehubah Yang Diperuntukkan Tindanan?

Dalam bidang pengaturcaraan C, adalah penting untuk memahami nuansa memori dikaitkan dengan memperuntukkan pembolehubah pada timbunan atau timbunan. Walaupun gaya pengaturcaraan dan reka bentuk harus diambil kira, adalah penting untuk menangani soalan asas: adakah dibenarkan untuk memanggil padam pada pembolehubah yang diperuntukkan pada tindanan?

Memeriksa Isu

Pertimbangkan kod berikut coretan:

int nAmount;
delete &nAmount;
class sample {
public:
    sample();
    ~sample() { delete &nAmount; }
    int nAmount;
};

Isu Keselamatan

Jawapan kepada soalan itu ialah tidak. Memanggil padam pada pembolehubah yang diperuntukkan tindanan adalah tidak selamat dan harus dielakkan.

Prinsip Peruntukan Memori

Untuk memahami sebabnya, adalah penting untuk memahami prinsip peruntukan memori . Untuk setiap:

  • mallok atau calloc, mesti ada satu percuma.
  • baharu, mesti ada satu pemadaman.
  • baharu[], mesti ada betul-betul satu pemadaman[].
  • Peruntukan tindanan, tidak sepatutnya ada pembebasan atau pemadaman yang jelas (pemusnah dipanggil secara automatik).

Campuran Haram

Pencampuran kaedah peruntukan ini adalah dilarang sama sekali. Percubaan untuk mengosongkan atau memadam[] objek yang diperuntukkan dengan yang baharu akan mengakibatkan tingkah laku yang tidak ditentukan. Perkara yang sama berlaku untuk memanggil padam pada pembolehubah yang diperuntukkan tindanan.

Akibat Pemadaman

Apabila memanggil padam pada pembolehubah yang diperuntukkan tindanan, pengkompil boleh melakukan pengoptimuman , seperti elision, dengan mengandaikan objek tidak digunakan selepas ia keluar dari skop. Walau bagaimanapun, panggilan padam secara eksplisit pada pembolehubah sedemikian boleh membawa kepada:

  • Rasuah Memori: Menimpa memori tindanan boleh merosakkan pembolehubah lain.
  • Kelakuan Tidak Ditakrifkan : Pengkompil boleh mengoptimumkan kod di bawah andaian bahawa objek itu bukan dirujuk selepas skop tamat. Memanggil padam boleh mengganggu tingkah laku ini.
  • Isu Pengendalian Pengecualian: Pembolehubah tindanan secara automatik dibersihkan semasa pengendalian pengecualian, tetapi pemadaman eksplisit boleh mengganggu proses ini.

Kesimpulan

Untuk mengekalkan integriti ingatan dan mengelakkan tingkah laku yang tidak ditentukan, adalah penting untuk menghormati prinsip peruntukan memori. Elakkan memanggil padam pada pembolehubah yang diperuntukkan tindanan dan mematuhi pasangan peruntukan dan deallocation yang sesuai: malloc/free, new/delete dan new[]/delete[].

Atas ialah kandungan terperinci Adakah Selamat untuk Memanggil `padam` pada Pembolehubah Diperuntukkan Tindanan 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