new...dipose = erro ???

Delphi

03/12/2003

Olá Pessoal....
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

C#r

Curtidas 0

Respostas

Bacalhau

Bacalhau

03/12/2003

Colega o melhor é mostrares o código entre o new e o dispose. Aparentemente o ponteiro está numa situação indefinida.


GOSTEI 0
C#r

C#r

03/12/2003

Olá amigo, obrigado pela resposta...

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;


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

03/12/2003

Tente: GetMem(variavel, SizeOf(TipoRealque se quer alocar));


GOSTEI 0
Beppe

Beppe

03/12/2003

Quando você chama New, ele aloca a quantidade de dados referenciada pelo ponteiro. Chamar com um PByte, você só tem direito a 1 byte, SizeOf(Byte) = 1. (Como o Delphi arredonda alocações para múltiplos de 4, você tem 4 bytes, mas esquece que te disse isso, é segredo).

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);


GOSTEI 0
Bacalhau

Bacalhau

03/12/2003

Pareceu-me que o ataliba chegou ao ponto certo. Como complemento, refiro que o comando

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


GOSTEI 0
Beppe

Beppe

03/12/2003

Putz, cometi um lapso terrível. Quando re-li minha resposta vi que mandei declarar um array estático, quando queria indicar um tipo ponteiro. Corrija a declaração para CommBuf: PByteArray;


GOSTEI 0
C#r

C#r

03/12/2003

caraca....esse pessoal é bom demais.....valeu pessoal, estou muito grato...vou tentar a correção agora mesmo..... VALEEEUUUUU !!!!!!!!


GOSTEI 0
C#r

C#r

03/12/2003

Peesoal, fiz o seguinte ......

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


GOSTEI 0
Bacalhau

Bacalhau

03/12/2003

:wink:


GOSTEI 0
POSTAR