Fórum Invalid Pointer Operation ao tentar liberar um objeto #423677

15/09/2012

0

Estou tendo o erro de invid pointer operation ao tentar liberar um objeto

este objeto implementa uma interface, e ao finalizar o processo tento liberar este objeto da memoria e da este erro

alguém sabe me dizer como faço pra resolver isso?

obrigado.
Rafael Reis

Rafael Reis

Responder

Posts

15/09/2012

Rafael Reis

alguém ai? estou ficando doido com esse erro. por favor me ajudem
Responder

Gostei + 0

15/09/2012

Marco Salles

Se o objeto implemta uma interface vc não precisa dar free . Ele é desalocado pela contagem de referencia
Uma especie de coletor de lixo caracteristico da utilização de interfaces
Responder

Gostei + 0

15/09/2012

Rafael Reis

Olá Marcos..

o problema todo é quando eu fecho a aplicação se eu não libero da memória da o erro de invalid pointer operation.

Eu tenho uma tela onde eu tenho uma propriedade do tipo da minha interface.

quando eu abro esta tela eu passo a instancia de um objeto para esta propriedade. funciona perfeitamente. porém qdo eu fecho o programa dispara esta exceção.

preciso saber onde, ou qual objeto eu preciso liberar da memoria para nao ocorrer esse erro novamente..

sabe me dizer qual o caminho eu devo tomar?

muito obrigado pela ajuda.
Responder

Gostei + 0

17/09/2012

Rafael Reis

Se quiser posso postar o código para você dar uma analisada.
Responder

Gostei + 0

17/09/2012

Alisson Santos

posta o código para nós analisarmos e poder dar uma resposta mais coerente.
Responder

Gostei + 0

17/09/2012

Rafael Reis

Ok,

Pois bem, é o seguinte, eu tenho uma classe de filtro, no qual ela chama uma tela, e essa classe implementa uma interface


essa classe e basicamente isso

TFilter<T> = class(TInterfacedObject, IFilterable)
private
FFieldsFilterList:TList;
FIndex: TList;
FMultiSelect: Boolean;
FScreenName: string;
FDataSet: TClientDataSet;
FOperationType: TOparationTypes;
FTask: string;
procedure SetDataSet(const Value: TClientDataSet);
procedure SetMultiSelect(const Value: Boolean);
procedure SetScreenName(const Value: string);
procedure SetOperationType(const Value: TOparationTypes);
procedure SetTask(const Value: string);
function GetIndexes(index: integer): TIndex;


function _FieldsFilter(index: Integer): TFieldFilter;
function _OperationType: TOparationTypes;
function _Task: string;
function _MultiSelect: Boolean;
function _ScreenName: string;



public


procedure AddField(value:TFieldFilter); overload;
procedure AddField(description, name, value:string;maskType:TMaskTypes; listValue:TStringList); overload;
procedure AddIndex(order:Integer;field,description:String);

function CountFields: integer;
function CountIndexs: integer;
function GetFieldByName(name:string):TFieldFilter;
function GetIndexs: Tlist;
function Filtering(parameters:TParametro):Tlist;

property ScreenName:string read _ScreenName write SetScreenName;
property MultiSelect:Boolean read _MultiSelect write SetMultiSelect;
property FieldsFilter[index:Integer]:TFieldFilter read _FieldsFilter;
property Indexes[index:integer]: TIndex read GetIndexes;
property OperationType:TOparationTypes read _OperationType write SetOperationType;
property Task:string read _Task write SetTask;


class function Execute(fil:TFilter<T>):TList;
constructor Create();
destructor Destroy(); override;

end;


O método execute chama esta outra tela, que é uma tela que auxilia e captura as informações para se efetuar o filtro.


class function TFilter<T>.Execute(fil:TFilter<T>): TList;
var
f: TFilter<T>
i:integer;
fieldFilter:TFieldFilter;
begin
Application.CreateForm(TfrmFilter,frmFilter);
frmFilter.Filter := fil; // essa propriedade Filter e do tipo da interface que a classe Filter implementa
frmFilter.ShowModal;
result := frmFilter.ResultList;
end;



o problema parece estar nas propriedades indexadas, FieldsFilter e Indexes, pois qual eu nao alimento elas, o erro para de ocorrer.

no create da classe eu faço isso:

constructor TFilter<T>.Create;
begin
FFieldsFilterList := TList.Create;
FIndex := TList.Create;
end;



e no destroy eu faço isso
destructor TFilter<T>.Destroy;
var
i:integer;
begin
for I := 0 to FFieldsFilterList.Count-1 do
FFieldsFilterList.Free;

for I := 0 to FIndex.Count-1 do
FIndex.Free;
end;


e o erro sempre aparece quando eu fecho a aplicação. Dispara o invalid pointer operation.


se nao entenderem ou precisarem de mais algum informação para entenderem o código por favor me digam.

desde já agradeço a ajuda.


Responder

Gostei + 0

17/09/2012

Alisson Santos

já tentou fazer um freeandnil ao inves de free???
Responder

Gostei + 0

17/09/2012

Rafael Reis

Puts Alisson, eu estava tentando liberar os objeto da classe filtro de tudo quanto é jeito e nao tinha me atentado em liberar estar propriedades de classe tbm. Realmente era isso. Com o freeandnil, ele esta liberando certinho da memorias essas propriedades. Eu ja tava ficando doido aqui com esse erro, mas agora está OK.

Muito obrigado pela ajuda.
Responder

Gostei + 0

17/09/2012

Rafael Reis

Aproveitando o ensejo,

Saberia me dizer, se o delphi tem alguma ferramenta para verificar vazamento de memórias?

estou usando a versao XE2.

obrigado novamente.


Responder

Gostei + 0

17/09/2012

Alisson Santos

Existe sim.

Existe uma rotina que quando você fecha o formulário ele mostra o vazamento de memória.
https://www.devmedia.com.br/detectando-memory-leaks-em-delphi-win32-com-cnmemprof-e-fastmm4/11146
Verifica se auxilia você.
Responder

Gostei + 0

17/09/2012

Marco Salles

Aproveitando o ensejo,

Saberia me dizer, se o delphi tem alguma ferramenta para verificar vazamento de memórias?

estou usando a versao XE2.

obrigado novamente.


Nas vesrões novas esta incporpora o FastMm

é so fazero seguinte no dpr na primeira linha antes de inicializar vc digite o seguinte comando

begin
ReportMemoryLeaksOnShutdown:=true;
Application.Initialize;


Mas faltando ao seu problema inicial o que vc pretende com isto ????


1
2
3
4
5
6
7
8
9
10
destructor TFilter<T>.Destroy;
var
i:integer;
begin
for I := 0 to FFieldsFilterList.Count-1 do
FFieldsFilterList.Free;
 
for I := 0 to FIndex.Count-1 do
FIndex.Free;
end;
Responder

Gostei + 0

17/09/2012

Alisson Santos

Obrigado Marcos, por não utilizar em minhas aplicações não sabia muito bem como responder e peguei um link que tinha aqui da devmedia mesmo.
Responder

Gostei + 0

17/09/2012

Rafael Reis

eu nao sei bem como funciona a classe TList do delphi.

Mas pesquisando na internet, algumas pessoas disseram que o interessante seria liberar cada objeto da memoria da lista, como em outras linguagens.

mas pelo visto isso nao funciona muito bem no delphi né? Usando o freeandil na Tlist, eu nao tive problema.

pelo que eu vi, o freeandnil, ele seta nulo no objeto e depois libera da memória.


vc´s aconselham usar sempre o freeandnil?
Responder

Gostei + 0

17/09/2012

Marco Salles

eu nao sei bem como funciona a classe TList do delphi.

Mas pesquisando na internet, algumas pessoas disseram que o interessante seria liberar cada objeto da memoria da lista, como em outras linguagens.

mas pelo visto isso nao funciona muito bem no delphi né? Usando o freeandil na Tlist, eu nao tive problema.

pelo que eu vi, o freeandnil, ele seta nulo no objeto e depois libera da memória.


vc´s aconselham usar sempre o freeandnil?

Ler Mais...



Bem vc não esta liberando cada objeto da Lista , vc esta Liberando a Lista e não porsequente os objetos dela estão sendo
liberados

veja este post

http://marcosalles.wordpress.com/2010/02/18/tlist-e-tobjectlist-objetos/


Finalizando . O seu conceito sobre o FreeandNil esta correto porem nen de todo verdade

Veja este post aqui mesmo

https://www.devmedia.com.br/forum/diferenca-entre-free-e-freeandnil/423681
Responder

Gostei + 0

17/09/2012

Rafael Reis



Bem vc não esta liberando cada objeto da Lista , vc esta Liberando a Lista e não porsequente os objetos dela estão sendo
liberados

veja este post

http://marcosalles.wordpress.com/2010/02/18/tlist-e-tobjectlist-objetos/


Finalizando . O seu conceito sobre o FreeandNil esta correto porem nen de todo verdade

Veja este post aqui mesmo

https://www.devmedia.com.br/forum/diferenca-entre-free-e-freeandnil/423681

Ler Mais...






Bastante interessante.

nesse caso então, como eu uso o TList em uma tela genéricar, eu teria que fazer dessa forma?

1
2
3
4
5
6
7
8
9
10
11
destructor TFilter<T>.Destroy;
var
i:integer;
begin
 
  for I := 0 to FFieldsFilterList.Count-1 do
    T(FFieldsFilterList).Free;  // Libero cada objeto da lista
 
  FreeandNil(FFieldsFilterList)  // libero a lista em si
 
end;


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar