Контекст: я пытаюсь обернуть голову вокруг указателей, мы просто видели их пару недель назад в школе, и, практикуя сегодня, я наткнулся на глупость? проблема, это может быть очень просто для вас, но у меня мало опыта программирования.
Я видел довольно много вопросов в SO об удалении указателей, но все они, похоже, связаны с удалением класса, а не с "простым" указателем (или каким бы правилом он ни был), здесь код я ' m пытается запустить:
#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" вернул адрес.
- Во втором примере ошибка не запускается, но выполнение cout значения myPointer еще возвращает адрес памяти?
- Действительно ли работает # 3? Кажется, для меня работает, указатель больше не хранит адрес, это правильный способ удаления указателя?
Извините за длинный вопрос, хотел сделать это как можно более ясным, а также повторить, у меня мало опыта в программировании, поэтому, если бы кто-то мог ответить на него с использованием вопросов непрофессионала, было бы очень полезно!