Контекст: Я пытаюсь осмыслить указатели, мы видели их всего пару недель назад в школе, а сегодня, тренируясь, я наткнулся на глупца? проблема, это может быть очень просто для вас, но у меня практически нет опыта программирования.
Я видел довольно много вопросов в 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 вернул адрес.
- Во втором примере ошибка не запускается, но выполнение cout значения myPointer по- прежнему возвращает адрес памяти?
- №3 действительно работает? Мне кажется, работает, указатель больше не хранит адрес, это правильный способ удалить указатель?
Извините за длинный вопрос, хотел прояснить это как можно более ясно, также повторяю, у меня мало опыта программирования, поэтому, если бы кто-то мог ответить на этот вопрос, используя условия непрофессионала, был бы очень признателен!
delete
то, что тыnew
. Также не требуется, чтобы указатель устанавливал значение NULL после его удаления. Если вам нужна безопасность, используйте интеллектуальные указатели, которые освобождают для вас память и выдают ошибки, когда вы пытаетесь получить к ним доступ, когда они чего-то не содержат.