Hallo zusammen,
und zwar arbeite ich im Moment mal wieder mit dem VirtualDrawTree und habe ein Problem bei der Zuweisung von Records an ein Node. Hier erst mal ein wenig Code:
Delphi-Quellcode:
type
PStringRecord = ^StringRecord;
StringRecord =
record
Text :
String[255];
// Short-String verwenden um Speicherleak zu umgehen, da sonst OnFreeNode
// des VST verwendet werden müsste
end;
{ ... }
var
node : PVirtualNode;
data : PStringRecord;
begin
node := VDT.AddChild(
nil);
data := VDT.GetNodeData(node);
New(data);
data^.Text := '
DP rules ;)';
Wenn ich die Zeile mit dem New weglasse und das Hinzufügen eines Childs in einer Schleife erledige, so erscheint ab und zu eine
Exception in einem Speicherbereich, aber ohne Hinweis, was passiert ist. Dann habe ich mir überlegt, dass der Record ja nirgends zugewiesen wird und data ja nur ein Zeiger auf den Record ist, ergo brauche ich einen neuen Speicher. Klar ist, dass ich den Speicher beim Beenden (oder ähnliches) wieder freigeben muss, was ja an sich über das Event OnFreeNode von VDT gehen müsste. Ist das bisher alles korrekt, was ich hier erzähle?
Des weiteren habe ich mal gesehen, dass wenn man einen ShortString (String[255]) verwendet, dass man keinerlei Speicherleaks bekommt. Wenn ich allerdings ein Dispose auf den Record mache, könnte ich dann eigentlich einen normalen String nehmen?
Des weiteren habe ich folgendes Konstrukt:
Delphi-Quellcode:
type
PMyData = ^TMyData;
TMyData = record
Data : TMyObject; // Zeiger auf ein beliebiges Objekt, hier nur ein Beispiel
end;
Es handelt sich hierbei ja um einen Record der einen Pointer auf ein beliebiges Objekt hält. Eigentlich muss ich hier doch auch den Speicher für den Record allozieren, oder?
Insgesamt wird ja keinerlei Speicher selbst wieder freigegeben (d.h. der erzeugten Records), oder?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)