![]() |
Delphi-Version: 2006
Dispose mit untypisiertem Pointer
Hallo, ich stehe gerade ein bisschen auf dem Schlauch:
Delphi-Quellcode:
Kann ich sowas machen, oder gibt das ein MemoryLeak? Kompilieren tut es zumindest, aber woher weiß Dispose die Größe des Records? Merkt der Speichermanager sich die? Wenn ja, kann ich mich darauf verlassen, dass das unter allen Versionen funktioniert?
type
PRecord = ^TRecord; TRecord = record { was auch immer } end; var TypedPointer: PRecord; UntypedPointer: Pointer; begin New(TypedPointer); UntypedPointer := TypedPointer; Dispose(UntypedPointer); end; Danke im Voraus |
AW: Dispose mit untypisiertem Pointer
Kannst du mit ReportMemoryLeaksOnShutDown := true; in der dpr prüfen. Sollte m. E. aber gehen, das sich der Pointer ja nicht geändert hat.
|
AW: Dispose mit untypisiertem Pointer
Das dürfte nicht richtig funktionieren, da ohne Typ die Information fehlt wieviel Speicher adressiert wird.
Gruß K-H |
AW: Dispose mit untypisiertem Pointer
ReportMemoryLeaksOnShutDown meldet keine Leaks, aber so ganz trau ich dem Braten nicht.
|
AW: Dispose mit untypisiertem Pointer
Ich verheddere mich auch gerade in der Pointern (müde), allerdings liefert
ReportMemoryLeaksOnShutDown=true keine Fehler, im Gegensatz zu einer Version ohne Dispose(UntypedPointer); Nur aus dem Bauch, wegen Übermüdung, Pointer ist Pointer ?? |
AW: Dispose mit untypisiertem Pointer
Für Records mit Managed Types wie (Long)Strings wird zwingend ein typisierter Pointer(cast) benötigt, denn sonst gibt es Speicherlöscher außer es gibt einen zusätzlichen Finalize Aufruf.
Delphi-Quellcode:
program RecordMemleak;
{$APPTYPE CONSOLE} type PRecord = ^TRecord; TRecord = record Value: string; end; var TypedPointer: PRecord; UntypedPointer: Pointer; begin ReportMemoryLeaksOnShutdown := True; New(TypedPointer); TypedPointer^.Value := 'Foo'; UntypedPointer := TypedPointer; Dispose(UntypedPointer); end. |
AW: Dispose mit untypisiertem Pointer
Ich würde fast schätzen, dass sich der MM die zu einer Adresse angeforderte Länge merkt. Schätzen! (Aber da es an sich ein Leichtes für ihn wäre, schätze ich das hier mal laut. Er klassifiziert Requests ja auch anhand der Größe in diverse Buckets.)
@RedBox: Ausser dort *hüstel* :mrgreen: (Was auch erklärbar wäre, da vom String nur der Pointer im Record liegt, der ja wieder ein ganz eigener für sich ist - und wovon der MM nicht so arg viel mitbekommt.) |
AW: Dispose mit untypisiertem Pointer
Zitat:
Zitat:
Damit wäre es wohl geklärt. Danke euch. |
AW: Dispose mit untypisiertem Pointer
Dispose weiß bei einem untypisiertem Zeiger nicht wie groß der Record ist.
Es gibt einfach nur den kompletten Speicherblock frei und fertig. Wenn sich in diesem Record Speicherblock aber referenzierte Variablen befanden, dann werden diese nicht freigegeben, denn ohne entsprechende TypeInfo (welche es bei einem typisiertem Zeiger bekommt) weiß es ja nichts davon. dynamische Arrays, String, Interfaces und Co., welche sich in dem Record befinden könnten, werden also nicht mit freigegeben. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz