Fórum Invalid Pointer Operation ao tentar liberar um objeto #423677
15/09/2012
0
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
Curtir tópico
+ 0Posts
15/09/2012
Rafael Reis
Gostei + 0
15/09/2012
Marco Salles
Uma especie de coletor de lixo caracteristico da utilização de interfaces
Gostei + 0
15/09/2012
Rafael Reis
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.
Gostei + 0
17/09/2012
Rafael Reis
Gostei + 0
17/09/2012
Alisson Santos
Gostei + 0
17/09/2012
Rafael Reis
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.
Gostei + 0
17/09/2012
Alisson Santos
Gostei + 0
17/09/2012
Rafael Reis
Muito obrigado pela ajuda.
Gostei + 0
17/09/2012
Rafael Reis
Saberia me dizer, se o delphi tem alguma ferramenta para verificar vazamento de memórias?
estou usando a versao XE2.
obrigado novamente.
Gostei + 0
17/09/2012
Alisson Santos
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ê.
Gostei + 0
17/09/2012
Marco Salles
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; |
Gostei + 0
17/09/2012
Alisson Santos
Gostei + 0
17/09/2012
Rafael Reis
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?
Gostei + 0
17/09/2012
Marco Salles
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?
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
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
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; |
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)