Ir para conteúdo
Fórum Script Brasil
  • 0

Pointer


kmkg

Pergunta

Pessoal, quando aloco memória para um Pointer:

...
private
  p:Pointer;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
  p := AllocMem(65536);
end;

Em outro ponto do programa gostaria de saber quanto foi alocado para p. Teria algum jeito de saber pelo próprio ponteiro ?

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Muito interessante. Sempre quis saber isso mas nunca perguntei porque não tem utilidade nenhuma já que se pode tomar nota de quanto se está alocando pra saber depois. É mais uma curiosidade muito forte de saber como ele faz para saber a quantidade alocada. É certo que ele sabe porque na hora de chamar FreeMem ele tem que saber quanto de momória ele tem que liberar, e no caso de ter que alocar mais ele tem que saber pra não alocar por cima da outra.

Bom, as funções GetMem e AllocMem alocam memória na heap, e não na pilha, e chamam SysAllocMem e SysGetMem que são internas do compilador e encapsuladas pelo MemoryManager do sistema. Acredito que o MemoryManager tenha uma pilha para anotar todos os ponteiros com seu respectivos tamanhos, pra poder fazer esse gerenciamento. Mas daí a ter acesso a ela eu já não sei. Vamos esperar os feras. rsrs.

Abraço.

Link para o comentário
Compartilhar em outros sites

  • 0

A informação fica nos 4 bytes anteriores:

var iTam_Aloc:Integer;
begin
  iTam_Aloc := (PInteger(Integer(p)-4)^ and not 3);
end;

Com a Borlndmm.dll do D6, ele aloca o próximo divisível de 4 + 4 bytes e não sendo inferior a 12 bytes. Os dois bits da direita(bitwise and not 3) são utilizados por ele.

Com a Borlndmm.dll do Turbo Delphi, isso mudou; a informação continua lá para alocações ± maiores que 2KB, para as menores não sei como ele faz.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...