Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

curirin107

Acess Violation ?

Recommended Posts

Boas.

Criei um programa para lojas e supermercados.

Estou com problemas ao gerar a nota fiscal.

 

Reparem o código:

var
str: tStringList;
it: tListItem;
i: integer;
begin
str.Create;
str.free;
sleep(1000);
str.Add('NOTA FISCAL - '+delimitar(loja, '|', 0));
str.Add('ITEM    PRODUTO            PREÇO');
for i:=0 to form3.items.items.count do
begin
it:= form3.items.Items[i];
str.Add(inttostr(i)+'    '+it.SubItems.GetText+'            '+it.SubItems.GetText);
end;
str.SaveToFile('nota_fiscal.txt');
str.Free;
winExec('notepad.exe -nota_fiscal.txt', SW_SHOW);
button1.SetFocus;
button1.Focused;
end;

 

Recebo o seguinte erro:

Acess Violation at adress 00403531 in module 'Project1.exe'. Read of adres 00000000.

 

Porquê?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem vários erros nesse seu código.

 

Primeiro, para criar um objeto, você usa a seguinte notação:

 

str := TStringList.Create;

// e NÃO

str.Create;

 

É sempre essa a ordem, variável := TTipoDaVariavel.Create;

 

Enfim, o erro lança bem aonde você está instanciando o objeto de forma errada. Corriga essas partes, veja se resolve, e poste aqui.

 

Acabei de ver que existem variáveis que foram declaradas com um determinado nome, mas você está chamando ela com outro nome, logicamente irá lançar um erro pois o compilador não irá encontrar tal variável. Um exemplo disso no seu código, é você chamando it, ao invez de i bem no laço de iteração for.

 

Além disso, não entendi esse método Free logo após a construção do objeto, testei aqui e realmente funciona, mas não faz sentido. Eu li na documentação do Delphi que esse método destrói o objeto e libera o espaço alocado por ele na memória, se necessário.

Alguém aproveita aí, e diz porque não lança erro eu construir um objeto, logo após liberar ele(destruir), e mesmo assim eu poder usar ele.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colegas o métodos Free libera o objeto da memória mas não limpa a variável de referência, para isso o método mais seguro é FreeAndNil(Objeto), com ele liberamos o objeto e setamos como nil a variável de referência.

 

Com o uso do FreeAndNil com certeza será lançada uma exceção Access violation caso o objeto já liberado seja invocado novamente sem uma nova instância.

Compartilhar este post


Link para o post
Compartilhar em outros sites

wllf, mas não compreendo, se Free libera o espaço da memória para o objeto, mas não a variavel de referência, então aonde esse objeto era armazenar informações ?

 

E essa variavel de referência, irá apontar para quem ? Já que o objeto não tem mais espaço na memória.

 

Então concluo que o Delphi trata referências à variáveis e espaço na memória de forma independente, o que é um pouco diferente de outras linguagens. Estou certo ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas.

Criei um programa para lojas e supermercados.

Estou com problemas ao gerar a nota fiscal.

 

Reparem o código:

var
str: tStringList;
it: tListItem;
i: integer;
begin
str.Create;
str.free;
sleep(1000);
str.Add('NOTA FISCAL - '+delimitar(loja, '|', 0));
str.Add('ITEM    PRODUTO            PREÇO');
for i:=0 to form3.items.items.count do
begin
it:= form3.items.Items[i];
str.Add(inttostr(i)+'    '+it.SubItems.GetText+'            '+it.SubItems.GetText);
end;
str.SaveToFile('nota_fiscal.txt');
str.Free;
winExec('notepad.exe -nota_fiscal.txt', SW_SHOW);
button1.SetFocus;
button1.Focused;
end;

 

Recebo o seguinte erro:

Acess Violation at adress 00403531 in module 'Project1.exe'. Read of adres 00000000.

 

Porquê?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Além disso, não entendi esse método Free logo após a construção do objeto, testei aqui e realmente funciona, mas não faz sentido. Eu li na documentação do Delphi que esse método destrói o objeto e libera o espaço alocado por ele na memória, se necessário.

Alguém aproveita aí, e diz porque não lança erro eu construir um objeto, logo após liberar ele(destruir), e mesmo assim eu poder usar ele.

Não há nada de errado em chamar o desctructor logo apos o constructor. É totalemte possível e aceito, apesar de inútil em 99% dos casos. É como fazer um:

  $myVar = new TMyVar;
 unset($myVar);

Porém você não vai poder usar ele sem recriá-lo pois o objeto não existe mais.

 

No fundo, todos os objetos em delphi são ponteiros para outro conjunto de ponteiros. O método Free de todos os objetos faz este objeto desvincular todos os endereços de suas propriedades e métodos mas não a sí próprio receber nil, sendo função da rotina FreeAndNil que chama os destructors de todos os seus filhos e atribui nil ao endereço do objeto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.