@StTüff: Der Fehler tritt offensichtlich in TmSession.FreeHENV beim Aufruf von SQLFreeHandle auf. Da läuft offensichtlich irgendetwas schief, was du schlecht beeinflussen kannst. Als ganz bösen Workaround kannst du die Zeile "SQLFreeHandle" in TmSession.FreeHENV in try..except klammern und den Fehler ignorieren:
Delphi-Quellcode:
procedure TmSession.FreeHENV;
begin
if FHENV = 0 then
exit;
try
SQLFreeHandle(SQL_HANDLE_ENV, FHENV);
except
end;
FHENV:=0;
end;
@peschai:
Zitat von
peschai:
Okay, Tobject.Free ist abgesichert, aber was ist mit den Nackommen?
In den meisten Fällen arbeiten wir mit Erben von TObject. Sobald diese etwas mehr im Free/Destroy
machen könnte in manchen Situation der Vorschlag von mir helfen.
Man arbeitet in Delphi
immer mit von TObject abgeleiteten Klassen. Hier gibt es für die Freigabe von Objekten zwei relevante Funktionen, die du ja schon genannt hast:
Den virtuellen Destruktor
destructor Destroy,
1. den man in eigenen Klassen überschreiben kann,
2. der
immer mit einem Aufruf von
inherited; enden sollte und
3. den man
nie direkt aufrufen sollte.
Die
statische Methode
procedure Free, die
1. man
nie überschreiben sollte,
2. als einzige (letzendlich) nutzen sollte, um ein Objekt freizugeben und
3. die eben aus dem Grund existiert, dass sie prüfen kann ob "Self <> nil" ist - eine virtuelle Methode kann das nämlich nicht.
Darum reicht
FreeAndNil! Den Zeiger vorher auf NIL zu prüfen ist überflüssig.