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