Mencampur malloc dan padam dalam C
Dalam C , pengurusan memori secara amnya melibatkan penggunaan sama ada malloc dan fungsi bebas atau operator baru dan padam . Walau bagaimanapun, mencampurkan kaedah peruntukan dan deallocation ini boleh membawa kepada tingkah laku yang tidak dijangka.
Pertimbangkan kod berikut:
<code class="cpp">int *p = (int *)malloc(sizeof(int)); delete p;</code>
Kod ini memperuntukkan penunjuk p kepada integer menggunakan malloc, tetapi kemudian cuba untuk delokasikannya menggunakan padam. Ini biasanya dianggap sebagai tingkah laku yang tidak ditentukan. Secara teorinya, menggunakan padam untuk mengagihkan memori yang diperuntukkan dengan malloc boleh menyebabkan kerosakan atau ranap memori.
Walau bagaimanapun, dalam sesetengah kes, kod ini mungkin tidak mengakibatkan ralat atau amaran serta-merta. Ini kerana pengkompil C mungkin tidak dapat menentukan dengan pasti sama ada memori di belakang p diperuntukkan dengan baharu atau malloc.
Begitu juga, membalikkan kaedah peruntukan dan deallocation:
<code class="cpp">int *p = new int; free(p);</code>
boleh juga mengakibatkan tingkah laku yang tidak ditentukan. Menggunakan percuma untuk mengagihkan memori yang diperuntukkan dengan yang baharu boleh berpotensi membawa kepada kebocoran memori atau isu lain.
Untuk mengelakkan tingkah laku yang tidak ditentukan sedemikian, adalah penting untuk memastikan anda menggunakan kaedah pengurusan memori yang konsisten. Anda harus sentiasa menggunakan malloc dan bebas bersama-sama untuk memori yang diperuntukkan dengan malloc, dan baharu serta padam bersama untuk memori yang diperuntukkan dengan baharu.
Untuk menjadikan pengurusan memori lebih mudah dan selamat, pertimbangkan untuk menggunakan penunjuk pintar C, seperti std:: unique_ptr atau std::shared_ptr. Petunjuk pintar mengurus peruntukan memori dan urusan jual beli secara automatik, mengurangkan risiko ralat dan kebocoran berkaitan memori.
Atas ialah kandungan terperinci Mengapa Mencampurkan `malloc` dan `padam` (atau `baru` dan `percuma`) dalam C Bermasalah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!