Problemer med frigivelse af hukommelse allokeret i en dll.

12 views
Skip to first unread message

René Laursen

unread,
May 12, 2026, 4:56:08 AM (2 days ago) May 12
to da...@googlegroups.com
Hej

Vi har et større programkompleks i Delphi XE7, med klienter der kontakter database mv. via en middletier-service.
Middletier servicen har bl.a. til opgave at hente komplekse data via webservices.  
Middletier-servicen er et 64-bit projekt (som sagt i XE7)
For at få løftet web-kommunikationen til TLS 1.2 (eller højere) har jeg flyttet web-service kaldene over i et Delphi-Alexandria projekt.
Dvs. jeg har en 64-bit Alexandria DLL med funktioner der returnerer komplekse objekter nedarvet fra TRemotable.
Jeg har ladet DLL'en selv frigive objekterne, ved at implementere  procedurer i dll'en som middletier-servicen kalder når data er behandlet.
Hvis jeg prøver at frigive den allokerede hukommelse, får jeg access violations.
Hvis jeg undlader at kalde frigivelses-procedurerne kører det uden problemer.

Hvad kan være årsag - og hvad mener I om at undlade at frigive ?
--

Venlig hilsen

René Laursen

SSV-udvikling


Jens Fudge

unread,
May 12, 2026, 5:12:37 AM (2 days ago) May 12
to da...@googlegroups.com

Hej René,

Hvis du får Access Violations på at frigive objekter kunne noget lugte af at du forsøger at frigive noget som du ikke har adgang til.

Hvis du frigiver noget som allerede er frigivet plejer man at få invalid pointer operation.

Lige i dit tilfælde har jeg svært ved at vurdere hvorfor.

Men det vigtige spørgsmål:
Hvad mener jeg om at undlade at frigive?

Jeg har for mange år siden lavet en service der kørte fint. Med jævne mellemrum måske hvert minut eller 10 minutter eller hvad man nu satte den op til, oprettede den en forbindelse til en Oracle server og bad om SELECT * FROM DUAL;

Jeg skulle bare checke om databasen svarede.

Efter denne server havde kørt 2-3 måneder crashede hele serveren som så måtte genstartes.

Jeg tænker det giver dig et indblik i hvad jeg mener om ikke at frigive, når det er en service vi snakker om. 


--
Du har modtaget denne besked, fordi du abonnerer på gruppen "DAPUG" i Google Grupper.
Hvis du vil ophæve abonnementet på denne gruppe og ikke længere modtage mails fra den, skal du sende en mail til dapug+un...@googlegroups.com.
Du kan se denne diskussion ved at gå til https://groups.google.com/d/msgid/dapug/75d10369-b617-40dd-acd1-026ceef8bd19%40ssv.dk.

HeartWare

unread,
May 12, 2026, 5:55:34 AM (2 days ago) May 12
to DAPUG
Et par meget vigtige spørgsmål til når man laver memory management i Delphi og .DLL filer:

1) Hvem allokerer memory? Det er den samme, der skal de-allokere (specielt, hvis det er objekter/classer).
2) Hvilken version et hhv. .DLL og .EXE? Hvis det ikke er samme version, så er det ikke samme klasser, selv om de hedder det samme. Du må derfor ikke overføre/behandle klasser allokeret i en fil til en anden fil (dvs. en funktion må IKKE returnere en TMyClass erklæret i .DLL fil til din .EXE selv om den har den samme TMyClass erklæring - der kan være interne forskelle på memory layout mellem forskellige Delphi versioner, selv på den samme klasse-definition)
3) Strenge er ligeledes et no-go at overføre mellem .DLL og .EXE hvis begge sider laver andet end blot at læse. Overfør som PChar i stedet for...
Reply all
Reply to author
Forward
0 new messages