Diferença entre Heap e Stack em C++

Antes de mais nada, esse post tem como objetivo iniciar uma discussão sobre esse assunto e possivelmente tirar umas dúvidas da galera que, assim como eu, ta estudando C++ seja na faculdade ou por conta própria. Então fico feliz com toda e qualquer interação/sugestão.

O que é Heap e Stack?

Heap e Stack são partes da memória que é alocada (memory allocation) para poder rodar nossas aplicações, memória essa que é utilizada pra guardar informações necessárias para a solução, sejam elas variáveis ou arquivos que o programa deverá ler para executar o que ele precisa executar.

Dito isso, uma das diferênças entre essas partes é em como elas vão nos dar a informação que procuramos durante a parte de memory allocation, fazendo com que a solução fique mais pesada ou mais lenta se forem usadas de maneira equivocada.

Vendo pela nomeclatura, alocação em Stack (Stack Allocation) nos remete a alocação em Pilha. O que isso significa? Justamente o que diz na estrutura de dados: é uma pilha de memória sendo alocada uma após a outra, do tamanho exato que é necessário para que o programa funcione, e isso ocasiona que esse tipo de alocação seja extremamente rápido e além disso, toda a memória que foi separada em Stack, no momento em que o programa sai do escopo em que ela foi alocada, é instantâneamente liberada, tornando esse tipo de alocação também muito eficiente.

Beleza, mas como que é a diferença entre esses dois tipos de alocação em código? Um ponto bem nítido de quando algo é alocado no Heap é o uso da keyword new, já quando é alocado no Stack, é uma declaração convencional rvalue = lvalue.

Exemplo:

int main()
{
    // Isso é uma alocação na Stack
    int value = 1;
    int* pValue = &value;

    // Isso é uma alocação no Heap
    int* hValue = new int;
    *hValue = 5;

    std::cin.get();
}

Pelo fato de utilizarmos a keyword new, ou malloc (Memory Allocation) na alocação no Heap, torna-se necessário que essa memória seja manualmente liberada assim que for terminado o seu uso, com o uso da keyword delete.

Conclusão

Por fim, pelo o que entendi, é preciso evitar ao máximo a alocação de memoria em Heap pois pode causar um custo de execução maior pra solução quando utilizada equivocadamente.

é preciso evitar ao máximo a alocação de memoria em Heap

Não.

O certo é entender bem as diferenças entre stack e heap, para que eles servem, e em quais casos cada um é o mais adequado - leia aqui para mais detalhes.

Tem casos, por exemplo, em que é mais recomendável - ou a única opção - alocar no heap (leia o link já indicado, lá está bem explicado).

Ver também: When is it best to use the stack instead of the heap and vice versa?

[Pode ajudar](https://pt.stackoverflow.com/q/56580/101). Eu acho que as respostas do SOen, especialmenet a aceita, não muito boas, apesar de certas, pode levar a entendimento errado pela simplificação, a aceita beira ao erro de tão simples, porque ser incompleto pode ser errado. E é importante notar que isso não é exclusivo de C++. Na verdade C e C++ nem definem isso na especificação. Embora na prática seja quase impossível fazer o que está lá sem *stack* e *heap*, não é algo formalmente especificado. Também seria bom deixar claro que [`malloc()`](https://en.cppreference.com/w/cpp/memory/c/malloc) é uma função, e em C++ evita-se bastante seu uso. Não há garantias que o `new` aloca no *heap*. E, uma atribuição pode fazer muita coisa diferente. Essa é até uma das críticas que se faz ao C++, embora seja uma *feature* poderosa também, porque o mundo não é maniqueísta. Eu até acho que afirmar que deve-se evitar ao máximo a alocação no *heap* não seja um erro absurdo, mas em modo pedante *on* (algumas pessoas adoram... quem? eu?!?!?! :D), de fato pode dar uma ideia errada para quem lê. Fica parecendo uma resposta do ChatGPT, quem não entende do assunto pode aprender errado. Sendo hiper pedante, "evitar" me parece um termo bom, mas que muitas pessoas vão interpretar errado por causa do "ao máximo". O próprio uso de "partes da memória" pode levar a algo que dê entendimento errado, mas chega de ser pedante por hoje :D --- Farei algo que muitos pedem para aprender a programar corretamente, **gratuitamente**. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações ([links aqui](https://github.com/maniero/SOpt)).
Muito show, obrigado por esses links, com certeza vai ajudar a galera que passar por aqui