tamanho da matriz alocada dinamicamente
-
19-09-2019 - |
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!
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).