Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 aelm@unicap.br Estruturas de Dados I Alocação Dinâmica de Memória aelm@unicap.br Gerenciamento de Memória • Alocação – Processo de reserva de uma ou mais células de memória para uma variável de programa; • Desalocação – Processo de devolução das células de memória de uma variável ao pool células de memória disponíveis; aelm@unicap.br � O tempo de vida de uma variável é o tempo durante o qual ela permanece vinculada a uma localização de memória específica; � O tempo de vida de um variável é o intervalo de tempo decorrente entre a sua alocação (“criação”) e a sua desalocação (“destruição”). Gerenciamento de Memória aelm@unicap.br � Classificação das Variáveis � Variáveis Globais � Variáveis Locais � Variáveis Dinâmicas (Heap) Gerenciamento de Memória aelm@unicap.br • Variáveis Globais – São alocadas AUTOMATICAMENTE no início da execução do programa; – São desalocadas AUTOMATICAMENTE no final da execução do programa. Gerenciamento de Memória aelm@unicap.br • Variáveis Locais – São alocadas AUTOMATICAMENTE no início da execução do sub-programa no qual foram declaradas; – São desalocadas AUTOMATICAMENTE no final da execução do sub-programa no qual foram declaradas. Gerenciamento de Memória 2 aelm@unicap.br • Variáveis Dinâmicas (Heap) � Uma variável heap é uma variável dinâmica que pode ser alocada e desalocada PELO PROGRAMADOR a qualquer momento durante a execução do programa. � Uma variável heap é uma variável anônima, ou seja, sem nome, e por isso só pode ser acessada através de seu endereço. Gerenciamento de Memória aelm@unicap.br � A criação (alocação) de uma variável heap é feita através de uma função chamada alocadora. Esta função retorna o endereço da variável heap alocada. � Função alocadora: malloc Sintaxe: void * malloc qtdBytes; Semântica: A função malloc retorna o endereço do bloco de memória de tamanho qtdBytes alocado. Gerenciamento de Memória aelm@unicap.br � Exemplo: int * ptr1; float * ptr2; ptr1 = (int *) malloc(sizeof(int)); ptr2 = (float *) malloc(sizeof(float)); OBSERVAÇÃO: Como malloc retorna ponteiro para void, é necessário fazer a conversão para o tipo de ponteiro correspondente ao dado que será armazenado na heap. Gerenciamento de Memória aelm@unicap.br � Exemplo: (i) int * ptr; (ii) ptr = (int *) malloc(sizeof(int)); (iii) *ptr = 10; Gerenciamento de Memória ptr ptr Variável do tipo int, anônima, alocada dinamicamente (HEAP). 10 ptr Variável do tipo int, anônima, alocada dinamicamente (HEAP). aelm@unicap.br � Exemplo: (i) struct pessoa { char nome [50]; int idade; float peso, altura; } (ii) struct pessoa * ptr; (iii) ptr = (struct pessoa *) malloc(sizeof(struct pessoa)); Gerenciamento de Memória ptr ptr Variável do tipo struct pessoa, anônima,alocada dinami- camente (HEAP). nome idade peso altura aelm@unicap.br � Exemplo(cont): (iii) ptr = (struct pessoa *) malloc(sizeof(struct pessoa)); (v)ptr->peso = 54.6; Gerenciamento de Memória ptr Variável do tipo struct pessoa, anônima,alocada dinamicamente (HEAP). nome idade peso altura ptr Variável do tipo struct pessoa, anônima,alocada dinamicamente (HEAP). nome idade 54.6peso altura 3 aelm@unicap.br � Exemplo: (i) int * ptr; (ii) ptr = (int *) malloc(100 * sizeof(int)); (iii) *(ptr + 1) = 5 Gerenciamento de Memória ptr ptr Variável do tipo vetor de inteiros, anônima,alocada dinamicamente (HEAP). 0 1 ... 98 99 ptr 5 0 1 ... 98 99 Variável do tipo vetor de inteiros, anônima,alocada dinamicamente (HEAP). aelm@unicap.br � A destruição (desalocação) de uma variável heap é feita através de uma função chamada desalocadora. � Função desalocadora: função free Sintaxe: free (ponteiro); Semântica: A função free devolve a memória apontada pelo ponteiro de volta para o heap. Isso torna a memória disponível para alocação. Gerenciamento de Memória aelm@unicap.br � Exemplo: free ptr; IMPORTANTE: (i) A função free não desaloca (destrói) o ponteiro. Ela destrói apenas a variável heap cujo endereço estava armazenado no ponteiro; (ii) A função free também não “limpa” o ponteiro, o mesmo permanece com o endereço da variável que foi desalocada. Gerenciamento de Memória ptr aelm@unicap.br � Observação: � Uma variável heap permanece acessível enquanto houver uma variável do tipo ponteiro que armazene seu endereço. Gerenciamento de Memória aelm@unicap.br � Problemas com Variáveis Heap � Variável Heap Perdida � Uma variável heap perdida é uma variável heap alocada mas não mais acessível ao programa. Também chamada de lixo de memória. � A geração de lixo de memória é conhecida como vazamento de memória. int * ptr; int i; … for (i = 1; i <= 10 i++) { ptr =(int*)malloc(sizeof(int)); //cria lixo de memória *ptr1 = i; } … Gerenciamento de Memória aelm@unicap.br � Problemas com Variáveis Heap � Referência Perdida � Uma referência perdida é uma referência a uma variável heap que foi desalocada. � Exemplo: int *ptr; ... ptr = (int *) malloc (sizeof(int)); ... free ptr; ... printf(“%i”,*ptr); � Referência perdida ... Gerenciamento de Memória 4 aelm@unicap.br � Problemas com Variáveis Heap � Referência Perdida – Exemplo 2: float *ptr1, *ptr2; … ptr1 = (float *) malloc(sizeof(float)); … ptr2 = ptr1; … free ptr1; … *ptr2 = 1.6; � Referência Perdida … Gerenciamento de Memória
Compartilhar