Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Profa. Dra. Ieda Hidalgo E-mail: iedahidalgo@ft.unicamp.br Alocação Estática e Dinâmica de Memória Operadores New e Delete 2 Definição Alocação de memória diz respeito à forma como a memória se organiza para a execução de um programa. Um programa pode alocar memória de forma: � Estática (antes da execução – em tempo de compilação) � Dinâmica (durante a execução do programa). 3 Exemplo de Organização da Memória 4 Alocação Estática Para a alocação estática de memória é necessário estabelecer previamente a quantidade de memória necessária (e isso não pode ser alterado durante execução do programa). Dessa forma, os dados são organizados sequencialmente na memória. Isso facilita a localização e a manipulação dos dados. Esse tipo de alocação ocorre na declaração de variáveis estáticas e globais. 5 Alocação Dinâmica Alocação dinâmica é o meio pelo qual um programa pode alocar / liberar memória durante a execução do programa (otimiza o uso da memória). Isso é feito na área heap do sistema, ou seja, na área disponível da memória após serem alocados código e variáveis estáticas e globais do programa. Essa forma de alocação de memória apresenta duas vantagens: (1) Não é necessário definir a priori o número de posições de memória necessárias. (2) É possível reduzir ou aumentar a quantidade de memória alocada inicialmente. 6 Um vetor pode ser alocado de forma estática ou dinâmica. Para alocar memória dinamicamente em C++ são usados os operadores new e delete. 7 Por que gerenciar dinamicamente a memória? Vamos supor que você queira escrever um programa para gerenciar os funcionários de uma empresa. Você pode fixar um número máximo de funcionários e criar um vetor estático com esse número de objetos. Isso pode ser ineficiente em duas situações: (1) Se a empresa tiver poucos funcionários, você estará reservando memória inútilmente. (2) Se o número pré-fixado for inferior ao número de funcionários da empresa, haverá “estouro de pilha”. 8 Solução A solução para esse tipo de problema é gerenciar dinamicamente a memória. Em C, são usadas as função: malloc() e free(). Em C++, são usados os operadores: new e delete. 9 Diferenças entre “malloc / free” e “new / delete” (1) Em C, malloc() e free() estão em bibliotecas (stdlib.h e alloc.h). Em C++, o gerenciamento dinâmico de memória é tão relevante que as palavras new e delete foram incorporadas à linguagem. 10 Diferenças entre “malloc / free” e “new / delete” (2) Em C, é necessário informar a malloc() o tamanho do tipo para o qual se pede memória (usando sizeof()). Em C++, o operador new descobre o tamanho do tipo para o qual se pede memória automaticamente. 11 Diferenças entre “malloc / free” e “new / delete” (3) Em C, o ponteiro genérico void que o SO devolve ao programa deve ser formatado explicitamente para o tipo do ponteiro (risco de erros). Em C++ essa conversão é feita pelo próprio operador new. 12 Diferenças entre “malloc / free” e “new / delete” (4) Em C, para inicializar um ponteiro é necessário usar uma terceira função: calloc(). Em C++, para inicializar um ponteiro basta usar a sintaxe: new tipo(inicializador). 13 Diferenças entre “malloc / free” e “new / delete” (5) A sintaxe usada em C++ é mais simples do que em C, conforme mostra a tabela abaixo. Resumindo, new e delete são mais confiáveis e mais fáceis de usar que malloc e free. Tanto malloc / free quanto new / delete retornam um ponteiro nulo quando a memória disponível é insuficiente. Portanto, é importante verificar o sucesso da alocação de memória. 14 Operador New O operador new obtém memória do SO e retorna um ponteiro para o primeiro byte do novo bloco de memória que foi alocado. Uma vez alocada, esta memória continua ocupada (ou seja, a variável criada pelo operador new pode ser acessada por qualquer parte do programa) até que seja desalocada explicitamente pelo operador delete. 15 Formas do Operador New O operador new conhece a classe do objeto sendo alocado e, automaticamente, chama o construtor para inicializar a memória alocada. 16 Operador Delete Quando o espaço reservado na área de heap não mais for necessário, deve-se liberá-lo para outra utilização usando o operador delete. O operador delete necessita do ponteiro que identifica a região do heap, cujo valor foi reservado na chamada de new. 17 Formas do Operador Delete Liberar a memória não libera o ponteiro que aponta para ela, simplesmente o endereço não é mais válido.
Compartilhar