Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Patutkah Penunjuk Ditetapkan kepada NULL dalam Pemusnah? Pandangan pada Amalan Terbaik dan Penyahpepijatan.

Patutkah Penunjuk Ditetapkan kepada NULL dalam Pemusnah? Pandangan pada Amalan Terbaik dan Penyahpepijatan.

Patricia Arquette
Patricia Arquetteasal
2024-10-28 06:30:30972semak imbas

 Should Pointers Be Set to NULL in Destructors? A Look at Best Practices and Debugging.

Menetapkan Penunjuk kepada NULL dalam Pemusnah

Dalam pengaturcaraan berorientasikan objek, adalah perkara biasa untuk memperuntukkan memori secara dinamik dan melepaskannya menggunakan pemusnah. Pertimbangkan kelas berikut yang memperuntukkan memori untuk objek jenis Bar:

<code class="cpp">class Foo
{
public:
  Foo() : bar(new Bar)
  {
  }

  ~Foo()
  {
    delete bar;
  }

  void doSomething()
  {
    bar->doSomething();
  }

private:
  Bar* bar;
};</code>

Timbul persoalan: adakah berfaedah untuk menetapkan penuding bar kepada NULL dalam pemusnah?

Hujah menentang Tetapan kepada NULL

Bertentangan dengan kepercayaan popular, menetapkan penunjuk kepada NULL dalam pemusnah adalah tidak disyorkan. Walaupun ia mungkin kelihatan seperti idea yang baik untuk tujuan penyahpepijatan, ia berpotensi membawa kepada masalah tersembunyi dalam binaan keluaran.

Jika penuding ditetapkan kepada NULL, rujukan berjuntai kepada objek yang dipadamkan mungkin wujud di suatu tempat. Dalam binaan nyahpepijat, rujukan ini akan dikesan dan mencetuskan ranap yang boleh didiagnosis. Walau bagaimanapun, dalam binaan keluaran, kod buggy mungkin mengelak daripada menggunakan penunjuk kerana ia menyedari bahawa ia adalah NULL, sekali gus mengaburkan isu asas.

Pendekatan Alternatif

Sebaliknya menetapkan penunjuk kepada NULL, amalan yang lebih baik ialah menetapkannya kepada nilai penunjuk buruk yang diketahui. Dengan cara ini, sebarang rujukan berjuntai pada objek yang dipadam masih akan cuba menggunakan penuding, mencetuskan ranap sistem yang boleh didiagnosis dan diperbaiki dengan lebih mudah.

Sebagai contoh, simpulan bahasa berikut boleh digunakan:

<code class="cpp">~Foo()
{
    delete bar;
    if (DEBUG) bar = (bar_type*)(long_ptr)(0xDEADBEEF);
}</code>

Pendekatan ini membolehkan pepijat yang berpotensi ditangkap dalam binaan nyahpepijat sambil memastikan binaan keluaran mengesan dan ranap pada rujukan berjuntai.

Kesimpulan

Sementara itu mungkin kelihatan seperti idea yang baik untuk menetapkan penunjuk kepada NULL dalam pemusnah, berbuat demikian boleh menyembunyikan isu yang berpotensi dalam binaan keluaran. Sebaliknya, adalah disyorkan untuk menetapkan penunjuk kepada nilai buruk yang diketahui dalam mod penyahpepijatan untuk memudahkan diagnosis dan penyahpepijatan.

Atas ialah kandungan terperinci Patutkah Penunjuk Ditetapkan kepada NULL dalam Pemusnah? Pandangan pada Amalan Terbaik dan Penyahpepijatan.. 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