Publicado em Programação

Alocação dinâmica de memória – C++

Depois de escrevermos o nosso programa temos que o compilar.

Nas linhas de código encontramos declarados vários tipos de variáveis que, como se pode imaginar, irão corresponder a áreas de armazenamento alojadas na memória principal.

Podemos então afirmar que existe uma classe de variáveis que são definidas quando o programa é compilado.

Eis alguns exemplos deste tipo de variáveis:

  • Variáveis globais/static (data segment)
  • Variáveis locais (stack)

Este tipo de alocação é muito rígido, pois obriga a conhecer exactamente a quantidade de memória que o nosso programa vai utilizar.

Na maior parte da vezes, e claro sem estarmos a falar de pequenos programas do tipo “Hello world!”, nem sempre é possível conhecer antecipadamente a quantidade de memória de que vamos necessitar.

A linguagem C possui as funções malloc() e free() que permitem alocar memória durante a execução do programa numa área da memória designada por heap ou free store. Deixo aqui um link para um artigo que exemplifica muito bem a utilização destas duas funções.

Embora a linguagem C++ suporte estas funções, disponibiliza uma forma mais eficiente para gerir de forma dinâmica a memória principal na área designada de free store, e mediante a utilização dos operadores new() e delete().

Entre livros e “Googladas” acabei por construir esta imagem que dá uma visão simplificada sobre a forma como o C++ gere a memória do computador.

Os URLs que deixo no final deste artigo permitem saber o principal sobre a Alocação Dinâmica de Memória em C/C++, mas o exemplo que vou dar é aquele que me chamou à atenção para este assunto.

Aqui à uns tempos tive uma dúvida que me surgiu quando confrontei o programa “Hello World!”, escrito em C++ e utilizando QT, do livro oficial ( C++ GUI Programming with Qt 4 ) com o tutorial do sítio da Troltech.
in: Troltech


#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[]){
    QApplication app(argc, argv);
    QPushButton hello("Hello world!");
    hello.show();
    return app.exec();
}

in: C++ GUI Programming with Qt4

#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[]){
    QApplication app(argc, argv);
    QPushButton *hello = new QPushButton("Hello world!");
    hello->show();
    return app.exec();
}

Ambas as versões executam a mesma tarefas, apenas fazem uma gestão diferente da memória.
Na primeira o objecto hello é criado na stack, pelo que apenas é visível na função main, e irá deixar de existir assim que esta função termine a sua execução.

No segundo exemplo hello, é criado como um apontador e utiliza-se o operador new para lhe associar uma área na memória livre (free store), onde permanecerá até que a aplicação termine ou seja explicitamente libertado mediante a utilização do operador delete.

Alguns links recomendados para aprofundar este assunto:

http://www.inf.pucrs.br/~pinho/PRGSWB/Ponteiros/ponteiros.html#Alocacao_Dinamica_de_Memoria
http://www.vivaolinux.com.br/artigo/Alocacao-dinamica
http://www.tech-faq.com/lang/pt/cpp-pointer.shtml
http://www.inf.ufsc.br/~ine5384-hp/Estruturas.AlocDinamica.html
http://www.linhadecodigo.com.br/Artigo.aspx?id=1198X

Anúncios

Uma opinião sobre “Alocação dinâmica de memória – C++

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s