Einzelnen Beitrag anzeigen

tommie-lie
(Gast)

n/a Beiträge
 
#6

Re: Objekt kopieren, ohne unnötige methoden/felder usw.

  Alt 12. Dez 2004, 11:01
Christian, Robert, ich glaube ihr redet ein wenig an Marios Problem vorbei... Es geht nicht darum, daß er überhaupt auf var2 zugreifen kann, sondern daß er das nach einem Typecast kann. Und da ist auch der Knackpunkt, "hi" wird nicht kopiert, sondern ist zufällig noch im Speicher:

blubb1 := blah1.Create; Es wird eine Instanz von blah1 erzeugt, ein Pointer darauf ist in blubb1 (wird später aber wieder verworfen, ohne freuzugeben).

blubb2 := blah2.Create; Es wird eine Instanz von blah2 erzeugt, ein Pointer darauf ist in blubb2.

blubb2.var2 := 'hi'; Der Pointer auf das Objekt wird dereferenziert und an die Stelle von "var2" wird "hi" geschrieben (daß der Longstring jetzt wiederum ein Pointer ist, vernachlässigen wir mal, es würde nur noch mehr verwirren ).

blubb1 := blubb2; Der Pointer, der auf die zweite Instanz (mit dem "hi" in "var2") zeigt, wird blubb1 zugewiesen.

showmessage((blubb1 as blah2).var2); // zeigt immernoch 'hi' Der Pointer wird dereferenziert und gecastet, wodruch "var2" als Offset zum Speicherbereich wieder zur Verfügung steht. Da der Speicherbereich mit dem von "blubb2" referenzierten identisch ist, ist natürlich auch der Inhalt identisch, und im Offset von "var2" gibt's ein "hi".

Delphi-Quellcode:
blubb1.Free;
blubb2.Free;
Das würde ich nach diesen Operationen so nicht machen, kann gut gehen, kann aber auch verdammt ins Auge gehen

Die Variable "var2" wird nicht in "blubb1" mitkopiert, sondern der Zeiger auf den Speicherbereich der blah2-Instanz wird einfach in "blubb1" geschrieben. Durch den Typecast erlaubt dir der Compiler den Zugriff auf das Offset von "var2", und weil du da vorher "hi" reingeschrieben hast und es zwischenzeitlich niemand da wieder weggenommen hat, ist es natürlich immer noch da



Edit: Nachdem ich gemerkt habe, daß es nicht gut aussah, doch noch Delphi-Tags hinzugefügt *g*
  Mit Zitat antworten Zitat