Contexto: Estou tentando entender os ponteiros, acabamos de vê-los há algumas semanas na escola e enquanto praticava hoje encontrei um idiota? problema, pode ser super simples para você, mas tenho pouca ou nenhuma experiência em programação.
Já vi algumas perguntas no SO sobre a exclusão de ponteiros, mas todas parecem estar relacionadas à exclusão de uma classe e não a um ponteiro "simples" (ou qualquer que seja o termo adequado), aqui está o código que estou tentando corre:
#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.
}
Então, minhas perguntas são:
- Por que o primeiro caso não funciona? Parece o uso mais simples de usar e excluir um ponteiro? O erro diz que a memória não foi alocada, mas 'cout' retornou um endereço.
- No segundo exemplo o erro não está sendo disparado mas fazer um cout do valor de myPointer ainda retorna um endereço de memória?
- # 3 realmente funciona? Parece que funciona, o ponteiro não está mais armazenando um endereço. Essa é a maneira correta de excluir um ponteiro?
Desculpe pela longa pergunta, queria deixar isso o mais claro possível, também para reiterar, eu tenho pouca experiência em programação, então se alguém pudesse responder usando termos leigos, ficaria muito grato!
delete
que vocênew
. Também não é necessário que o ponteiro se defina como NULL após você excluí-lo. Se você quiser segurança aí, use smart pointers, que liberam a memória para você e dão erros quando você tenta acessá-los quando não estão segurando algo.