AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Unverständlicher Memory Leak: String-Initialisierung in Record
Thema durchsuchen
Ansicht
Themen-Optionen

Unverständlicher Memory Leak: String-Initialisierung in Record

Ein Thema von s.h.a.r.k · begonnen am 25. Jun 2012 · letzter Beitrag vom 26. Jun 2012
 
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Unverständlicher Memory Leak: String-Initialisierung in Record

  Alt 25. Jun 2012, 16:11
Ich kann den Code leider nicht testen, weil ich kein Delphi mit Generics zur Verfügung habe, aber ich tippe auf einen Compiler-Bug. Bei früheren Versionen haben verschachtelete Record-Operatoren oft gar nicht erst funktioniert sondern interne Compiler-Fehler ausgelöst, sodass man gezwungen war, immer erst alles einer Variable zuzuweisen, bevor man etwas als Funktionsargument übergibt.

Finde deine Lösung mit dem String aber sehr interessant, weil ich ein ähnliches Record-Konstrukt verwende, um in Delphi 2006 einen nativen Unicode-String zu simulieren (weil WideString zu langsam ist). Ich hatte das gleiche Problem mit den nicht initialisierten Feldern aber habe es „gelöst“ durch manuelles Aufrufen einer Init- bzw. Free-Funktion, auch wenn mir das eigentlich gar [edit]nicht [/edit] gefällt. Mal schauen, ob ich es durch die String-Variante einfacher lösen kann... hoffentlich ohne Memory-Leak.[edit]Nein, geht leider nicht, weil ich am Ende den reservierten Platz freigeben muss. Ich könnte zwar ein Interface benutzen, aber dann wäre der Performance-Vorteil wohl dahin...[/edit]

Edit:

Aber sag mal, eigentlich geht es dir ja darum, so eine Art record/class helper für ein Array zu implementieren, oder? Wie wäre es, wenn du stattdessen einfach eine Klasse deklarierst und dann auf diese castest – dann wird das gecastete Array der aufgerufenen Methode als Self übergeben. Solange die Methoden nicht virtuell sind, sollte das klappen.

Z.B. so:
Delphi-Quellcode:
TArrayHelper<T> = class
public
  procedure SetLength(Length: integer);
  function GetLength: integer;
  property Length: integer read GetLength write SetLength;
end;

procedure TArrayHelper<T>.SetLength(Length: integer);
var
  Arr: array<T>;
begin
  // Ich bin mir gerade nicht sicher, ob Delphi den Typecast so schluckt,
  // aber mit ein bisschen Getrickse bekommt man den schon hin.
  Pointer(Arr) := Pointer(Self);
  System.SetLength(Arr, Length);
end;

function TArrayHelper<T>.GetLength: integer;
var
  Arr: array<T>;
begin
  Pointer(Arr) := Pointer(Self);
  Result := Length(Arr);
end;
Damit könnte man dann z.B. sowas machen:
Delphi-Quellcode:
var Arr: array<T>;

TArrayHelper<T>(Arr).Length := 10;
TArrayHelper<T>(Arr).Length := TArrayHelper<T>(Arr).Length + 2;

Geändert von Namenloser (25. Jun 2012 um 16:45 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 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