Bối cảnh: Tôi đang cố gắng quấn đầu quanh con trỏ, chúng tôi chỉ nhìn thấy chúng một vài tuần trước ở trường và trong khi thực hành hôm nay tôi chạy vào một ngớ ngẩn? vấn đề, nó có thể siêu đơn giản với bạn nhưng tôi có ít hoặc không có kinh nghiệm lập trình.Xóa con trỏ trong C++
Tôi đã thấy một vài câu hỏi trong SO về việc xóa con trỏ nhưng tất cả dường như liên quan đến việc xóa lớp và không phải là con trỏ 'đơn giản' (hoặc bất kỳ cụm từ thích hợp nào), đây là 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 sẽ không phải là trường hợp đầu tiên làm việc? Dường như việc sử dụng đơn giản nhất để sử dụng và xóa một con trỏ là gì? Lỗi nói rằng bộ nhớ không được cấp phát nhưng 'cout' đã trả về một địa chỉ.
- Trên ví dụ thứ hai lỗi không được kích hoạt nhưng làm một cout giá trị của myPointer vẫn còn trả về địa chỉ bộ nhớ?
- # 3 thực sự có hoạt động không? Dường như làm việc với tôi, con trỏ không còn lưu trữ địa chỉ nữa, đây có phải là cách thích hợp để xóa con trỏ không?
Xin lỗi cho câu hỏi dài, muốn làm này càng rõ ràng càng tốt, cũng để nhắc lại, tôi có rất ít kinh nghiệm lập trình, vì vậy nếu ai đó có thể trả lời về sử dụng này của giáo dân, nó sẽ được đánh giá rất nhiều!
Lý do bạn không thấy ví dụ đầu tiên là vì nó sai. Chỉ 'xóa' những gì bạn' mới'. Nó cũng không cần thiết cho con trỏ để thiết lập chính nó để 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ải phóng bộ nhớ cho bạn và đưa ra lỗi khi bạn cố truy cập chúng khi chúng không giữ gì đó. – chris
Hmm được rồi, tôi không chắc con trỏ thông minh là gì, nhưng tôi sẽ xem xét nó, cảm ơn! – leopic
Tóm lại, họ làm những gì tôi mô tả. Để giữ một cái gì đó mới, bạn gọi là 'reset' và nó giải phóng cái cũ. Để giải phóng nó mà không cần thay thế, bạn gọi 'release'. Khi nó đi ra khỏi phạm vi, nó bị phá hủy, và có thể giải phóng bộ nhớ dựa trên loại đó là gì. 'std :: unique_ptr' chỉ dành cho một chủ sở hữu. 'std :: shared_ptr' giải phóng nó khi chủ sở hữu cuối cùng ngừng sở hữu tài nguyên. Họ cũng là ngoại lệ an toàn. Nếu bạn phân bổ một tài nguyên với một, và sau đó gặp phải một ngoại lệ, tài nguyên sẽ được giải phóng thích hợp. – chris