Pergunta

É verdade que um ponteiro atribuído ao endereço inicial de uma matriz alocada dinamicamente não tem a informação do tamanho da matriz? Então, nós temos que usar outra variável para armazenar o seu tamanho para mais tarde processar a matriz através do ponteiro.

Mas quando libertar a matriz alocada dinamicamente, não especificar o tamanho, em vez disso, apenas "ptr livre" ou "delete [] ptr". Como poderia liberar ou excluir saber o tamanho da matriz? Podemos usar o mesmo esquema para evitar armazenar o tamanho da matriz em outra variável?

Obrigado!

Foi útil?

Solução

Sim, isso é verdade.

delete sabe o tamanho do pedaço de memória, porque new adiciona informações extras para o bloco (geralmente antes que a área voltou para o usuário), contendo seu tamanho, juntamente com outras informações. Note que isto é tudo muito específica de implementação e não deve ser usado por seu código.

Então, para responder sua última pergunta: Não - não podemos usá-lo - é um detalhe de implementação que é altamente plataforma e compilador dependente.


Por exemplo, na atribuição de memória de amostra demonstrada em K & R 2, isto é o "cabeçalho" colocado antes de cada bloco alocado:

typedef long Align; /* for alignment to long boundary */

union header { /* block header */
  struct {
    union header *ptr; /* next block if on free list */
    unsigned size; /* size of this block */
  } s;

  Align x; /* force alignment of blocks */
};

typedef union header Header;

size é o tamanho do bloco alocado (que é então usado por free, ou delete).

Outras dicas

O engraçado é que, historicamente, era delete [20] arr; assim como é arr = new int[20]. No entanto prática provou que a informação sobre o tamanho pode ser indolor armazenados pelo alocador, e uma vez que a maioria das pessoas a usá-lo, em seguida, armazenada de qualquer maneira, foi adicionado ao padrão.

O que é mais engraçado, e pouco conhecido, é o fato de que este "Sintaxe delete estendida" é na verdade apoiada por alguns C ++ compiladores (apesar de ser incorreta, mesmo em face do C ++ 98 standard), embora nenhum requerem -lo.

int* arr = new int[20];
delete [20] arr;

A parte triste sobre tudo isso, porém, é que não há nenhuma maneira conformes padrão para recuperar esse tamanho passado para seu próprio uso: - /

É verdade que a matriz não contém o tamanho da matriz, você tem que armazenar essas informações para mais tarde. Ao excluir um array através delete ou free é o ponteiro para a memória alocada você passar. O gerenciador de memória usada (ou pelo sistema ou seu próprio costume de substituir novo e excluir) conhece a área da memória que é liberado, e mantém o controle do mesmo. Espero que isso faz sentido.

Sim, é verdade. Esta é parte da razão por que você raramente deve tentar lidar com isso diretamente, e usar um contêiner padrão em vez disso. Sobre a única vez que faz sentido para lidar com isso é se você decidir implementar um recipiente-se (caso em que você normalmente rastrear as informações de tamanho na implementação do seu recipiente).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top