next up previous contents
Next: Apontadores para funções Up: Apontadores Previous: Revisão de apontadores   Sumário

Alocação Dinâmica

Em C, alocação dinâmica é tratada por rotinas de uma biblioteca adicional. Estas rotinas tornaram-se tão utilizadas que sentiu-se, durante o projeto de C ++, que sua funcionalidade devia fazer parte da linguagem de maneira a melhorar sua eficiência. Por este motivo, os operadores new e delete tornaram-se parte integrante de C ++, assim como um operador de adição ou atribuição.

O exemplo abaixo ilustra o uso destes operadores.

indentation

#include $<$iostream.h$>$

struct date {
int month;
int day;
int year;
};

main()
{
int index, $\ast$point1, $\ast$point2;

point1 = &index;
$\ast$point1 = 77;
point2 = new int;
$\ast$point2 = 173;
cout $\ll$ "The values are " $\ll$ index $\ll$ $\ll$
$\ast$point1 $\ll$ $\ll$ $\ast$point2 $\ll$ begintex2html_wrap_inline$$n";
point1 = new int;
point2 = point1;
$\ast$point1 = 999;
cout $\ll$ "The values are " $\ll$ index $\ll$ $\ll$
$\ast$point1 $\ll$ $\ll$ $\ast$point2 $\ll$ begintex2html_wrap_inline$$n";
delete point1;

float $\ast$float_point1, $\ast$float_point2 = new float;

float_point1 = new float;
$\ast$float_point2 = 3.14159;
$\ast$float_point1 = 2.4 $\ast$ ($\ast$float_point2);
delete float_point2;
delete float_point1;

date $\ast$date_point;

date_point = new date;
date_point$\rightarrow$month = 10;
date_point$\rightarrow$day = 18;
date_point$\rightarrow$year = 1938;
cout $\ll$ date_point$\rightarrow$month $\ll$ "/" $\ll$ date_point$\rightarrow$day $\ll$ "/" $\ll$
date_point$\rightarrow$year $\ll$ begintex2html_wrap_inline$$n";
delete date_point;

char $\ast$c_point;

c_point = new char[37];
delete [] c_point;
c_point = new char[sizeof(date) + 133];
delete [] c_point;
}
Observe que o operador new requer um modificador, o qual deve ser um tipo. Neste exemplo, point2 aponta para uma variável inteira que foi dinamicamente alocada e pode, a partir daquele momento, ser usada como uma variável normal.

Posteriormente neste exemplo point1 também passa a apontar para uma variável dinamicamente alocada, e point2 recebe este mesmo endereço. Observe que neste ponto o endereço a que point2 originalmente se referia é perdido, de forma que não é possível desalocar point2. Por este motivo, o operador delete é apenas aplicado a point1. Após a aplicação do operador delete, o espaço usado pela variável dinâmica torna-se disponível para outras alocações; portanto, os apontadores liberados desta forma não devem ser referenciados depois.

Caso o argumento para o operador delete seja NULL, o operador nada fará. Efetivamente, este operador só pode ser aplicado a variáveis que tenham sido alocadas com o operador new. Se ele for aplicado a qualquer outro tipo de variável, então qualquer coisa pode acontecer -- até mesmo um crash do sistema, se assim for definido pelo autor do compilador.

O exemplo também mostra o uso destes operadores com outros tipos de variáveis, neste caso floats e structs.

Finalmente, neste exemplo ilustra-se a utilização destes operadores para alocar e desalocar blocos de tamanho arbitrários. Neste caso, aloca-se um arranjo de 37 caracteres (em geral, 37 bytes) e também um arranjo cujo tamanho é 133 bytes maior que o tamanho da estrutura date.

Note que é muito importante a indicação, quando for o caso, de que se está removendo um arranjo que foi dinamicamente alocado com new. Esta indicação é feita usando-se o modificador [] após o operador delete. A ausência do modificador não será acusada como erro nem em tempo de compilação nem em tempo de execução; porém, ela pode comprometer a correta execução de programas mais complexos do que o apresentado neste exemplo. Esta responsabilidade é puramente do programador.

O resultado da execução deste programa é:

     The values are 77  77  173
     The values are 77  999  999
     10/18/1938

As funções de C para o gerenciamento de memória dinâmica, malloc(), calloc() e free(), podem ainda ser utilizadas em C ++. Entretanto, seu uso não deve ser misturado com os novos operadores introduzidos por C ++, ou os resultados podem ser imprevisíveis. Novos programas devem utilizar exclusivamente os novos operadores, uma vez que estes são muito mais eficientes.


next up previous contents
Next: Apontadores para funções Up: Apontadores Previous: Revisão de apontadores   Sumário
Ivan Luiz Marques Ricarte 2001-06-01