ใช่.
"อันตราย" เท่านั้นที่สามารถทำได้คือการแนะนำการไม่มีประสิทธิภาพ (การดำเนินการร้านค้าที่ไม่จำเป็น) ในโปรแกรมของคุณ - แต่ค่าใช้จ่ายนี้จะไม่มีนัยสำคัญเมื่อเทียบกับค่าใช้จ่ายในการจัดสรรและการปลดบล็อคหน่วยความจำในกรณีส่วนใหญ่
หากคุณไม่ทำเช่นนั้นคุณจะมีตัวชี้ที่น่ารังเกียจบางข้อบกพร่องหนึ่งวัน
ฉันมักจะใช้แมโครเพื่อลบ:
#define SAFEDELETE(ptr) { delete(ptr); ptr = NULL; }
(และคล้ายกันสำหรับอาร์เรย์, ฟรี (), ปล่อยที่จับ)
คุณยังสามารถเขียนวิธีการ "ลบตัวเอง" ที่อ้างอิงถึงตัวชี้ของรหัสการโทรดังนั้นพวกเขาจึงบังคับให้ตัวชี้ของรหัสการโทรไปที่ NULL ตัวอย่างเช่นในการลบทรีย่อยของวัตถุจำนวนมาก:
static void TreeItem::DeleteSubtree(TreeItem *&rootObject)
{
if (rootObject == NULL)
return;
rootObject->UnlinkFromParent();
for (int i = 0; i < numChildren)
DeleteSubtree(rootObject->child[i]);
delete rootObject;
rootObject = NULL;
}
แก้ไข
ใช่เทคนิคเหล่านี้ละเมิดกฎบางประการเกี่ยวกับการใช้งานแมโคร (และใช่วันนี้คุณอาจได้ผลลัพธ์ที่เหมือนกันกับเทมเพลต) - แต่โดยใช้มาหลายปีฉันไม่เคยมีมาก่อนเข้าถึงหน่วยความจำที่ตายแล้ว - หนึ่งในสิ่งที่อันตรายที่สุด ใช้เวลาส่วนใหญ่ในการแก้ไขปัญหาที่คุณพบ ในทางปฏิบัติในช่วงหลายปีที่ผ่านมาพวกเขาได้กำจัดคลาสของข้อบกพร่อง whjole จากทุกทีมที่ฉันแนะนำพวกเขา
นอกจากนี้ยังมีหลายวิธีที่คุณสามารถนำไปใช้ด้านบน - ฉันแค่พยายามแสดงความคิดในการบังคับให้คนชี้ NULL ตัวชี้ถ้าพวกเขาลบวัตถุแทนที่จะให้วิธีการที่พวกเขาจะปล่อยหน่วยความจำที่ไม่เป็นตัวชี้ของผู้โทร .
แน่นอนตัวอย่างข้างต้นเป็นเพียงขั้นตอนต่อตัวชี้อัตโนมัติ ซึ่งฉันไม่ได้แนะนำเพราะ OP ถูกถามโดยเฉพาะเกี่ยวกับกรณีที่ไม่ได้ใช้ตัวชี้อัตโนมัติ
delete
ตัวชี้โมฆะซึ่งเป็นเหตุผลหนึ่งที่ทำให้ตัวชี้เป็นศูนย์ได้ดี