alocação dinâmica de memória
DESCRIPTION
Alocação Dinâmica de MemóriaTRANSCRIPT
1
Estruturas de Dados I
Alocação Dinâmica de Memória
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;
� O tempo de vida de uma variável é o tempo durante o qual ela permanecevinculada 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
� Classificação das Variáveis� Variáveis Globais
� Variáveis Locais
� Variáveis Dinâmicas (Heap)
Gerenciamento de Memória
• 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
• 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
• 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
� 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 heapalocada.
� Função alocadora : mallocSintaxe :
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
� 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
� Exemplo :
(i) int * ptr;
(ii) ptr = (int *) malloc(sizeof(int));
(iii) *ptr = 10;
Gerenciamento de Memória
ptr
ptrVariável do tipo int, anônima,alocada dinamicamente (HEAP).
10
ptrVariável do tipo int, anônima,alocada dinamicamente (HEAP).
� Exemplo : (i) struct pessoa {
char nome [50];
int idade;
float peso, altura;
}
(ii) struct pessoa * ptr;
(iii) ptr = (struct pessoa *) malloc(sizeof(struct pes soa));
Gerenciamento de Memória
ptr
ptrVariável do tipo struct pessoa, anônima,alocada dinami-camente (HEAP).
nome
idade
peso
altura
� Exemplo (cont): (iii) ptr = (struct pessoa *) malloc(sizeof(struct pes soa));
(v)ptr->peso = 54.6;
Gerenciamento de Memória
ptrVariável do tipo struct pessoa, anônima,alocada dinamicamente(HEAP).
nome
idade
peso
altura
ptrVariável do tipo struct pessoa, anônima,alocada dinamicamente (HEAP).
nome
idade
54.6peso
altura
3
� Exemplo : (i) int * ptr;
(ii) ptr = (int *) malloc(100 * sizeof(int));
(iii) *(ptr + 1) = 5
Gerenciamento de Memóriaptr
ptrVariável do tipo vetor de inteiros, anônima,alocada dinamicamente (HEAP).
0 1 ... 98 99
ptr
5
0 1 ... 98 99Variável do tipo vetor de inteiros, anônima,alocada dinamicamente (HEAP).
� A destruição (desalocação ) de uma variável heap é feita através de uma função chamada desalocadora.
� Função desalocadora : função freeSintaxe : 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
� 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
� 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
� Problemas com Variáveis Heap� Variável Heap Perdida
� Uma variável heap perdida é uma variável heapalocada 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
� 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
� 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