A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

2002/2003 Programação Orientada para Objectos 1 Aula 5 Memória livre e instâncias dinâmicas Criação de instâncias dinâmicas Destruição de instâncias dinâmicas.

Apresentações semelhantes


Apresentação em tema: "2002/2003 Programação Orientada para Objectos 1 Aula 5 Memória livre e instâncias dinâmicas Criação de instâncias dinâmicas Destruição de instâncias dinâmicas."— Transcrição da apresentação:

1 2002/2003 Programação Orientada para Objectos 1 Aula 5 Memória livre e instâncias dinâmicas Criação de instâncias dinâmicas Destruição de instâncias dinâmicas Problemas comuns Matrizes dinâmicas Introdução à memória dinâmica em classes: Construtores e destrutores Problema da cópia e da atribuição

2 2002/2003 Programação Orientada para Objectos 2 Instâncias (I) Características: Tipo Valor VariáveisConstantes Valor alterávelValor fixo

3 2002/2003 Programação Orientada para Objectos 3 Instâncias (II) DeclaradasNão-declaradas Características: nome tipo valor Características: sem nome tipo valor AutomáticasEstáticasTemporáriasDinâmicas Construídas quando a instrução de definição é atingida e destruídas no final do respectivo bloco. Construídas no início do programa ou quando a sua instrução de definição é atingida pela primeira vez e destruídas no final do programa. Construídas durante o cálculo de uma expressão e destruídas no final da expressão completa em que são criadas. Construídas e destruídas sob o domínio integral do programador.

4 2002/2003 Programação Orientada para Objectos 4 int* p = new int(10); int const* p = new int const(10); Criação de instâncias dinâmicas (I) p:int* :int 10 p:int const* :int {frozen} 10

5 2002/2003 Programação Orientada para Objectos 5 Aluno* pa = new Aluno(Zé, 77); Aluno const* pac = new Aluno const(Zé, 77); Criação de instâncias dinâmicas (II) pa:Aluno* :Aluno nome_ = Zé número_ = 77 pac:Aluno const* :Aluno {frozen} nome_ = Zé número_ = 77

6 2002/2003 Programação Orientada para Objectos 6 Destruição de instâncias dinâmicas delete pa; delete pac; A partir deste momento pa e pac contêm lixo.

7 2002/2003 Programação Orientada para Objectos 7 Regras 1. Todas as instâncias dinâmicas têm de ser destruídas uma e uma só vez! 2. Quem constrói, destrói.

8 2002/2003 Programação Orientada para Objectos 8 Erros mais comuns Fugas de memória: instâncias dinâmicas construídas e nunca destruídas for(int i = 0; i != 1000000; ++i) int* p = new int(i); int const* p = new int const(10); p = new int const(20); Outros casos: double* p = new double(1.1); delete p;

9 2002/2003 Programação Orientada para Objectos 9 Matrizes dinâmicas: operadores new[] e delete[] int* p = new int[10]; for(int i = 0; i != 10; ++i) p[i] = i; for(int i = 0; i != 10; ++i) cout << p[i] << endl; delete[] p;

10 2002/2003 Programação Orientada para Objectos 10 E quando não há memória? Lançamento de excepção Alternativa (a evitar): #include … int* p = new(nothrow) int(20); if(p == 0) { cerr << Não havia memória! << endl; … }

11 2002/2003 Programação Orientada para Objectos 11 Memória dinâmica em classes (I) class PilhaDeInt { public: typedef int Item; … private: static int const capacidade_inicial = 32; int capacidade_actual; Item* itens; int número_de_itens; bool cumpreInvariante() const; };

12 2002/2003 Programação Orientada para Objectos 12 Memória dinâmica em classes (II) Construtor: inline PilhaDeInt::PilhaDeInt() : capacidade_actual(capacidade_inicial), itens(new Item[capacidade_actual]), número_de_itens(0) { assert(cumpreInvariante()); }

13 2002/2003 Programação Orientada para Objectos 13 Memória dinâmica em classes (III) void PilhaDeInt::põe(Item const& novo_item) { assert(cumpreInvariante()); if(número_de_itens == capacidade_actual) { Item* novos_itens = new Item[capacidade_actual * 2]; for(int i = 0; i != número_de_itens; ++i) novos_itens[i] = itens[i]; capacidade_actual *= 2; delete[] itens; itens = novos_itens; } itens[número_de_itens] = novo_item; ++número_de_itens; assert(cumpreInvariante()); }

14 2002/2003 Programação Orientada para Objectos 14 Memória dinâmica em classes (IV) Evitar fuga de memória: é necessário um destrutor inline PilhaDeInt::~PilhaDeInt() { assert(cumpreInvariante()); delete[] itens; }


Carregar ppt "2002/2003 Programação Orientada para Objectos 1 Aula 5 Memória livre e instâncias dinâmicas Criação de instâncias dinâmicas Destruição de instâncias dinâmicas."

Apresentações semelhantes


Anúncios Google