Bối cảnh: Tôi đang cố gắng quấn lấy các con trỏ, chúng tôi vừa nhìn thấy chúng vài tuần trước ở trường và trong khi luyện tập hôm nay tôi đã gặp phải một điều ngớ ngẩn? vấn đề, nó có thể rất đơn giản với bạn nhưng tôi có rất ít hoặc không có kinh nghiệm lập trình.
Tôi đã thấy khá nhiều câu hỏi trong SO về việc xóa con trỏ nhưng chúng dường như đều liên quan đến việc xóa một lớp chứ không phải con trỏ 'đơn giản' (hoặc bất kỳ thuật ngữ thích hợp nào có thể là), đây là đoạn mã tôi đang cố gắng chạy:
#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.
}
Vì vậy, câu hỏi của tôi là:
- Tại sao trường hợp đầu tiên không hoạt động? Có vẻ như cách sử dụng đơn giản nhất để sử dụng và xóa một con trỏ? Lỗi cho biết bộ nhớ không được cấp phát nhưng 'cout' đã trả về một địa chỉ.
- Trong ví dụ thứ hai, lỗi không được kích hoạt nhưng thực hiện một cout giá trị của myPointer vẫn trả về địa chỉ bộ nhớ?
- # 3 có thực sự hoạt động không? Có vẻ như có tác dụng với tôi, con trỏ không còn lưu trữ địa chỉ, đây có phải là cách thích hợp để xóa một con trỏ không?
Xin lỗi vì câu hỏi dài, tôi muốn làm cho điều này rõ ràng nhất có thể, cũng cần nhắc lại, tôi có ít kinh nghiệm lập trình, vì vậy nếu ai đó có thể trả lời câu hỏi này bằng cách sử dụng thuật ngữ của giáo dân, nó sẽ được đánh giá rất cao!
delete
những gì bạnnew
. Nó cũng không bắt buộc con trỏ phải tự đặt thành NULL sau khi bạn xóa nó. Nếu bạn muốn an toàn ở đó, hãy sử dụng con trỏ thông minh, giúp giải phóng bộ nhớ cho bạn và đưa ra lỗi khi bạn cố truy cập khi chúng không giữ thứ gì đó.