Kleine Zeiger-Frage
-
Tach.
Ich habe mal da ne kleine Frage zu einem Zeiger.
Block *block; block = reinterpret_cast<Block*>(BlockEditor->Document->BlockRoot->Blocks->Items[i]);und dann kann ich mit block->Name und so weiter damit arbeiten.
Meine Frage ist jetzt: Muss man in irgendeiner Form diesen Zeiger "killen" oder verwirft dieser sich bei Funktionsende wirklich selbst?
-
nuein schrieb:
Meine Frage ist jetzt: Muss man in irgendeiner Form diesen Zeiger "killen" oder verwirft dieser sich bei Funktionsende wirklich selbst?
Da dieser Zeiger auch nur eine lokale Variable ist und du keinen Speicher angefordert hast: letzteres.
-
Dass Variablen am Funktionsende bzw. Blockende zerstört werden, gilt für alle Variablentypen, natürlich auch für Zeiger.
Du verwechselst anscheinend was: Wenn du mit new Speicher allozierst, musst du nicht den Zeiger zerstören (der verschwindet von selbst), sondern diesen angeforderten Speicher freigeben. Ohne new brauchst du auch kein delete.
-
Ja, soweit kenne ich das auch, aber das Delphi Beispiel macht mir dann doch Kopfzerbrechen.
var G: Block; begin G := BlockEditor1.FocusedBlock; G.Ungroup; G.Parent.RemoveBlock(G); G.Free; end;Dort wird die Variable auch "freigegeben" und kein Create benutzt. Oder wie muss man das in Pascal deuten?
-
Dieses "Free" dort dürfte nichts mit Zeiger-Arithmetik zu tun haben - das ist eine Methode der Klasse Block (und du mußt dir in der Hilfe mal ansehen, was diese Methode bewirken soll).
-
Es ist keine Methode der Klasse Block. Es ist ein Pascal Befehl.
CBuilder Hilfe:
Die Methode Free löst die Instanz eines Objekts auf und gibt nötigenfalls den zugehörigen Speicher frei.
__fastcall Free();
Beschreibung
Rufen Sie die Methode Free eines Objekts nicht auf, sondern verwenden Sie statt dessen das Schlüsselwort delete, das Free zur Freigabe eiens Objekts aufruft. Wenn die Objektreferenz nicht NULL ist, wird Destroy aufgerufen.
-
du sagst es sei keine methode, und dann zitierst du einen hilfetext wo drin steht, das es eine methode ist...ist das methode von dir?
-
Ich sagte doch nur das es keine Methode der Klasse Block ist, sondern Free() eine allgemeine Methode ist die zumal von Delphi kommt und in C++ dem delete entspricht.
Es also etwas allgemeines ist und keine geheime Funktion der Klassse.Wenn ich aber im CBuilder in einer Funktion wo ich "Block *block;" mache und am Ende "delete block;" setze, meldet sich beim Programmstart sofort ein Fehler.
Darum Frage ich ja hier, weil ich das nicht ganz nachvollziehen kann. -.-
-
Um es mal etwas zu verdeutlichen.
Ich erstelle ein neues CBuilder Projekt.
Schmeisse dort die BlockEditor Komponente rein und einen Button
mit folgendem Inhalt:void __fastcall TForm1::Button1Click(TObject *Sender) { if (BlockEditor1->FocusedBlock) { Block *block; block = reinterpret_cast<Block*>(BlockEditor1->FocusedBlock); block->Left = 1; delete block; } }Jetzt erstelle ich zur Laufzeit ein Objekt im BlockEditor1 und drücke den Button .. Speicherfehler!
Nehme ich das "delete block;" wieder raus, läuft alles bestens. Im Pascal sieht man aber immer ein Block.Free; ...

-
In Pascal steht aber auch noch was von "RemoveBlock", womit Du den BlockEditor wohl dieses Blockes beraubst. Damit gehört der Block nicht mehr dem BlockEditor sondern Dir, und Du bist dafür verantwortlich, ihn zu löschen.
Warum solltest Du einen Block löschen, der sich noch im BlockEditor befinden soll?
Nur so eine Vermutung btw, da ich kein Delphi kann

-
Das könnte natürlich sein. Ich werde mir mal neben den Beispielen die Quelltexte genauer anschauen. Danke.