AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Objekt in Array kopieren und anschließend freigeben
Thema durchsuchen
Ansicht
Themen-Optionen

Objekt in Array kopieren und anschließend freigeben

Ein Thema von blackdrake · begonnen am 30. Aug 2008 · letzter Beitrag vom 1. Sep 2008
 
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#13

Re: Objekt in Array kopieren und anschließend freigeben

  Alt 31. Aug 2008, 03:56
Um mal auf deine Originalfragen noch einzugehen:

Zitat von blackdrake:
Anschließend gebe ich Submission frei. Und dies verursacht bei mir eine AV bei allen zukünftigen Zugriffen auf die Array-Elemente und deren Eigenschaften.
Anders als bei Records wird bei Objekten stets "by reference" zugegriffen, und eine Zuweisung an eine andere Variable macht da keinen Unterschied. Submissions und das Array-Element dem du Submissions zugewiesen hast, zeigen beide auf den selben Speicherbereich. Das Objekt gibt es nach wie vor nur ein einziges Mal, du zeigst aber zwei mal darauf.

Zitat von blackdrake:
Kommentiere ich die Zeile "Submission.Free" aus, funktioniert alles. Dies erachte ich jedoch als ein Problem, da der Speicher nicht freigegeben wird. Was passiert hier? Wieso wird in der Funktion AddToArray() keine Kopie der TSubmission-Instanz gemacht, die in den Array wandert? Wieso gehen die Array-Elemente kaputt, wenn ich das Originalstück freigebe?
Wenn du Submissions frei gibst, wird der Speicher auf den die Variable zeigt freigegeben. Das ist aber nun genau der selbe Bereich auf den das Array-Element zeigt, wodurch Zugriffe auf dieses dann eben im Nirvana landen. Es wird bei Objekten prinzipiell erst einmal nie etwas kopiert, es sei denn man kümmert sich ganz explizit draum.

Zitat von blackdrake:
Bei Strings, die als Variable in eine Funktion wandern, kenne ich die Routine UniqueString(). Hier muss ich mein TSubmission irgendwie auch "einzigartig" machen, oder?
Nein. Einfach Klasseninstanzen (=Objekte) die noch verwendet werden nicht freigeben. Dabei musst du eben zwischen dem eigentlichen Objekt welches irgendwo auf dem Heap sitzt, und den Variablen unterscheiden, die immer nur ein Zeiger auf diese Stelle auf dem Heap sind unterscheiden.


Prinzipiell ist es aber auch völlig richtig TObjectList einzusetzen. Ein Array ist für das was du dort vor hast recht ungeeignet.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  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 22:49 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