new...dipose = erro ???
03/12/2003
0
Estou com o seguinte problema e preciso de ajuda.......
veja o seguinte código...
var buffer : ^Byte;
begin
new (buffer);
..
..
dispose (Buffer);
ao executar o programa, é apontado um erro na linha onde está o comando dispose, com a seguinte mensagem ´Invalid Pointer Operation´
:?: :?: :?:
... bem...coloquei um remark no dispose e o programa roda legal...mas depois de um tempo ele começa a dar erro de falta de ´ resources ´...
Agradeço a ajuda dos colegas..... :roll: :roll:
C#r
Posts
03/12/2003
Bacalhau
03/12/2003
C#r
Bem, estou usando o Delphi 4 professional (aquele da CD EXPERT).
desenvolvi um equipamento que monitora 8 canais digitais e 8 canais analógicos em uma unidade remota e em caso de pane ele chama a central (via modem) e passa todos estes parametros de telemetria em tempo real para um computador onde roda este programa em delphi.
Usei ponteiros em diversos pontos do programa, e todos deram o mesmo problema. Por sorte, pude omitir o new, pois estes ponteiros apenas copiavam o endereço de chamada, mas sobrou um que precisa ser inicializado... o código segue abaixo....
procedure TForm1.GetCommand(Comando,Ah,Al,Data : Byte);
var soma : Byte;
ComBuff , // Combuff e ComBuffcopy são usados no RX e TX
ComBuffCopy : ^Byte; // para chamadas das procedures de CommPort.
Const Count = 5; // Todo packet contém 5 bytes
begin
new (ComBuff); // criando as variáveis usadas para passar
// new (ComBuffCopy); // dados para CommPort <== este deu para tirar !
ComBuffCopy := ComBuff; // copy guarda endereço inicial
ComBuff^ := Comando; // Comando
inc (ComBuff); // atualiza vetor
ComBuff^ := Ah; // Endereço alto
inc (ComBuff); // Atualiza vetor
ComBuff^ := Al; // Endereço baixo
inc (ComBuff); // Atualiza vetor
ComBuff^ := Data; // Quantidade a ler
soma := Comando+Ah+Al+Data; // CheckSum
inc (ComBuff); // Atualiza vetor
ComBuff^ := soma; // Checksum no buffer de TX
// ModemMessageBar(´CheckSum:´ + intToStr(soma));
if CommPort.SendData(ComBuffCopy,Count) <> 0 then LedTxOn;
TimeOut_.Enabled := true; //solicita cronômetro TimeOut
//dispose(ComBuff);
end;
03/12/2003
Marcelo Saviski
03/12/2003
Beppe
Dispose espera um ponteiro referenciando o primeiro byte de uma alocação. No seu caso, o ponteiro já esta alguns bytes há frente, então, é claro, corrompe o alocador de memória.
Solução:
1) Declare CommBuf como array[0..$FFFF] of Byte;
2) Aloque via GetMem(CommBuf, Count);
3) Acesse a memória via CommBuf[xxx]. O primeiro índice é zero.
4) A dealocação fica Dispose(CommBuf);
03/12/2003
Bacalhau
dispose(ComBuff);
liberta o ComBuff, mas deixa o CommBuffCopy numa situação indefinida. Sugiro que antes do dispose(ComBuff) faças
CommBuffCopy := nil;
quanto ao comando
ComBuffCopy := ComBuff; // copy guarda endereço inicial
ele dispensa o New anterior. Tá correcta a eliminação do tal New.
espero ter ajudado
abraço
bacalhau
03/12/2003
Beppe
04/12/2003
C#r
04/12/2003
C#r
ComBuff := ComBuffCopy;
Dispose (ComBuff);
ComBuffCopy := Nil;
{ levando em considereção o que o amigo Ataliba afirmou quanto ao index estar adiantado em relação ao endereço inicial, como ComBuffCopy era cópia do endereço inicial...... }
FUNCIONOU LEGAL ........
obrigado pessoal..... :D
Clique aqui para fazer login e interagir na Comunidade :)