Olá novamente galera,
Como sugerido por alguns colegas daqui, resolvi voltar para o básico e estou fortalecendo minhas bases antes de tentar ir para frente, então lá vai…
Pelo que eu entendi, a vantagem de você usar new para alocar memória é o fato que depois você vai poder usar o delete para desalocar de maneira fácil, ao contrário de quando você cria um vetor, por exemplo, que para desalocar a memória dele você tem que percorrer todo o vetor desalocando a memória de cada posição.
Certo?
int main() {
int* p3 = new int[5]{ 5, 4, 3, 2, 1 };
int* stackPoint;
int i = 0;
stackPoint = p3;
while(i < 5) {
cout << p3 << ": "<< *p3 << "\n";
p3++;
i++;
}
p3 = stackPoint;
delete[] p3;
system("pause");
return 0;
}
Outra dúvida aproveitando o gancho, existe uma maneira mais inteligente de se usar o delete? Pois nesse meu caso eu tive que criar um outro ponteiro chamado stackPoint para receber o primeiro endereço alocado de p3. Não existe outra forma de eu recuperar o primeiro endereço do p3 sem usar a minha variável extra (stackPoint)?
Não. isso tem haver com heap versus stack.
vc usa new quando vc quer criar um objeto cujo ciclo de vida vai alem do bloco lexico onde ele foi criado.
se vc precisa criar um objeto e retorna-lo para quem chamou ( através do ponteiro ), então vc precisa usar new e quem receber precisa usar um delete.
é diferente de java onde o new é a unica forma de criar objetos e vc tem um garbage collector que vai remove-los em algum momento no futuro.
o seu exemplo de vetor é complexo pq o destrutor de uma collection pode chamar o destrutor de cada elemento no seu interior - mas como não manjo de C++/ RAII/ etc vou esperar a galera mais entendida ajudar.
Estou a quase duas horas lendo sobre heap e stack e finalmente entendi, vlw pela resposta. Esclareceu completamente minhas dúvidas.