บริบท: ฉันพยายามห่อหัวตัวชี้เราเพิ่งเห็นพวกเขาเมื่อสองสามสัปดาห์ก่อนในโรงเรียนและขณะฝึกซ้อมวันนี้ฉันเจอเรื่องงี่เง่า? ปัญหาอาจตรงไปตรงมาสำหรับคุณ แต่ฉันไม่ค่อยมีประสบการณ์ในการเขียนโปรแกรมเลย
ฉันเคยเห็นคำถามไม่กี่ข้อใน SO เกี่ยวกับการลบพอยน์เตอร์ แต่ดูเหมือนว่าทั้งหมดจะเกี่ยวข้องกับการลบคลาสไม่ใช่ตัวชี้ 'ธรรมดา' (หรือคำที่เหมาะสมอาจเป็นอะไรก็ได้) นี่คือรหัสที่ฉันพยายาม วิ่ง:
#include <iostream>;
using namespace std;
int main() {
int myVar,
*myPointer;
myVar = 8;
myPointer = &myVar;
cout << "delete-ing pointers " << endl;
cout << "Memory address: " << myPointer << endl;
// Seems I can't *just* delete it, as it triggers an error
delete myPointer;
cout << "myPointer: " << myPointer << endl;
// Error: a.out(14399) malloc: *** error for object 0x7fff61e537f4:
// pointer being freed was not allocated
// *** set a breakpoint in malloc_error_break to debug
// Abort trap: 6
// Using the new keyword befor deleting it works, but
// does it really frees up the space?
myPointer = new int;
delete myPointer;
cout << "myPointer: " << myPointer << endl;
// myPointer continues to store a memory address.
// Using NULL before deleting it, seems to work.
myPointer = NULL;
delete myPointer;
cout << "myPointer: " << myPointer << endl;
// myPointer returns 0.
}
ดังนั้นคำถามของฉันคือ:
- ทำไมเคสแรกถึงใช้ไม่ได้? ดูเหมือนจะตรงไปตรงมาที่สุดในการใช้และลบตัวชี้? ข้อผิดพลาดแจ้งว่าหน่วยความจำไม่ได้รับการจัดสรร แต่ "cout" ส่งกลับที่อยู่
- ในตัวอย่างที่สองข้อผิดพลาดไม่ได้ถูกทริกเกอร์ แต่การสร้างค่าของ myPointer ยังคงส่งคืนที่อยู่หน่วยความจำ?
- # 3 ได้ผลจริงหรือ? ดูเหมือนจะใช้ได้ผลสำหรับฉันตัวชี้ไม่ได้จัดเก็บที่อยู่อีกต่อไปนี่เป็นวิธีที่เหมาะสมในการลบตัวชี้หรือไม่
ขออภัยสำหรับคำถามที่ยาวต้องการทำให้ชัดเจนที่สุดและขอย้ำอีกครั้งว่าฉันมีประสบการณ์ในการเขียนโปรแกรมน้อยดังนั้นหากมีใครสามารถตอบคำถามนี้ได้โดยใช้เงื่อนไขของคนธรรมดาก็จะได้รับการชื่นชมอย่างมาก!
delete
new
นอกจากนี้ยังไม่จำเป็นสำหรับตัวชี้ในการตั้งค่าตัวเองเป็น NULL หลังจากที่คุณลบ หากคุณต้องการความปลอดภัยที่นั่นให้ใช้ตัวชี้อัจฉริยะซึ่งช่วยให้หน่วยความจำว่างและให้ข้อผิดพลาดเมื่อคุณพยายามเข้าถึงเมื่อพวกเขาไม่ได้ถืออะไรบางอย่าง