alocação dinâmica de memória

4
1 [email protected] Estruturas de Dados I Alocação Dinâmica de Memória [email protected] 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; [email protected] 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 [email protected] Classificação das Variáveis Variáveis Globais Variáveis Locais Variáveis Dinâmicas (Heap) Gerenciamento de Memória [email protected] 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 [email protected] 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

Upload: noturnoam548

Post on 22-Dec-2015

250 views

Category:

Documents


4 download

DESCRIPTION

Alocação Dinâmica de Memória

TRANSCRIPT

Page 1: Alocação Dinâmica de Memória

1

[email protected]

Estruturas de Dados I

Alocação Dinâmica de Memória

[email protected]

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;

[email protected]

� 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

[email protected]

� Classificação das Variáveis� Variáveis Globais

� Variáveis Locais

� Variáveis Dinâmicas (Heap)

Gerenciamento de Memória

[email protected]

• 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

[email protected]

• 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

Page 2: Alocação Dinâmica de Memória

2

[email protected]

• 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

[email protected]

� 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

[email protected]

� 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

[email protected]

� 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).

[email protected]

� 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

[email protected]

� 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

Page 3: Alocação Dinâmica de Memória

3

[email protected]

� 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).

[email protected]

� 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

[email protected]

� 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

[email protected]

� 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

[email protected]

� 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

[email protected]

� 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

Page 4: Alocação Dinâmica de Memória

4

[email protected]

� 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