AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi VirtualDrawTree: Zuweisung von Records, Speicherallozierung?
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualDrawTree: Zuweisung von Records, Speicherallozierung?

Ein Thema von s.h.a.r.k · begonnen am 20. Apr 2010 · letzter Beitrag vom 20. Apr 2010
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

VirtualDrawTree: Zuweisung von Records, Speicherallozierung?

  Alt 20. Apr 2010, 20:24
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)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

Re: VirtualDrawTree: Zuweisung von Records, Speicherallozier

  Alt 20. Apr 2010, 20:47
Erstmal: Das New weglassen, denn der Speicher wird vom TreeView direkt in den Nodes reserviert
und GetNodeData liefert einen Zeiger auf diesen Speicher.

Der TreeView hat einen Property, bei welchem man die Größe seiner Daten angeben muß.
(weiß grad nicht wie der heißt, aber er sollte sich leicht im OI des TreeViews finden lassen)
Hast du da auch genügend Speicher für deinen Record angegeben?
Wenn nicht, dann gibt es natürlich ein einen Bufferoverrun und ein Speicherleck durch dein New.
(dieses muß vor dem Erstellen des ersten Nodes passieren)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

Re: VirtualDrawTree: Zuweisung von Records, Speicherallozier

  Alt 20. Apr 2010, 21:07
Oh mein Gott... Ich bin ein Depp, anders kann ich das echt nicht sagen. Ich suche seit ewigen Zeiten den Fehler und finde ihn nicht

Delphi-Quellcode:
type
PStringRecord = ^TStringRecord;
TStringRecord = record
  Text : String[255]; // Short-String verwenden um Speicherleak zu umgehen, da sonst OnFreeNode
                      // des VST verwendet werden müsste
end;

{ ... }

// Das hier hatte ich...
vdtTable.NodeDataSize := SizeOf(PStringRecord);

// und das hier wäre richtig gewesen...
vdtTable.NodeDataSize := SizeOf(TStringRecord);
Wie schaut es eigentlich aus mit dem ShortString? Stimmt die Aussage?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

Re: VirtualDrawTree: Zuweisung von Records, Speicherallozier

  Alt 20. Apr 2010, 21:26
Zitat von s.h.a.r.k:
Wie schaut es eigentlich aus mit dem ShortString? Stimmt die Aussage?
Ein ShortString liegt direkt im Record drin, also ja, es stimmt
und solange du kein Unicode benötigst, ist es auch gut nutzbar.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz