Kontekst: Próbuję zawinąć głowę wokół wskazówek, widzieliśmy je kilka tygodni temu w szkole i podczas dzisiejszych ćwiczeń wpadłem na głupiego? problem, może to być dla ciebie bardzo proste, ale mam niewielkie doświadczenie w programowaniu.
Widziałem w SO sporo pytań dotyczących usuwania wskaźników, ale wszystkie wydają się być związane z usunięciem klasy, a nie „prostym” wskaźnikiem (lub jakimkolwiek właściwym terminem), oto kod, który próbuję biegać:
#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.
}
Więc moje pytania to:
- Dlaczego pierwszy przypadek nie zadziała? Wydaje się, że użycie i usuwanie wskaźnika jest najprostsze? Błąd mówi, że pamięć nie została przydzielona, ale „cout” zwrócił adres.
- W drugim przykładzie błąd nie jest wyzwalany, ale wykonanie cout wartości myPointer nadal zwraca adres pamięci?
- Czy numer 3 naprawdę działa? Wydaje mi się, że działa, wskaźnik nie przechowuje już adresu, czy to właściwy sposób na usunięcie wskaźnika?
Przepraszam za długie pytanie, chciałem wyjaśnić to tak jasno, jak to tylko możliwe, a także powtórzyć, mam niewielkie doświadczenie w programowaniu, więc jeśli ktoś mógłby odpowiedzieć na to używając terminów laika, byłoby to bardzo wdzięczne!
delete
to, co tynew
. Po usunięciu wskaźnika nie jest również wymagane, aby ustawiał się na NULL. Jeśli chcesz mieć tam bezpieczeństwo, użyj inteligentnych wskaźników, które zwalniają pamięć i wyświetlają błędy, gdy próbujesz uzyskać do nich dostęp, gdy czegoś nie zawierają.