Контекст: Я намагаюся обернути голову навколо покажчиків, ми щойно бачили їх пару тижнів тому в школі, і сьогодні, практикуючись, я натрапив на дурного? Проблема може бути для вас надзвичайно простою, але я майже не маю досвіду програмування.
У 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 після його видалення. Якщо ви хочете там безпеки, використовуйте розумні вказівники, які звільняють пам’ять для вас і видають помилки при спробі отримати до них доступ, коли вони чогось не містять.