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)