Autor Beitrag
Karsten_
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 20.01.12 09:35 
Meine Frage ist wie folgt.

Ich habe eine Klasse mit nichtverwalteten Resourcen, welche einerseits durch die Methode 'Dispose' und andererseits durch den Destruktor freigegeben werden (können). Die Methode 'CreateChild' gibt eine neue Instanz dieser Klasse zurück, ist aber darauf angewiesen, dass die Instanz, für die 'CreateChild' aufgerufen wurde, ihre nichtverwalteten Resourcen behält, sprich der Destruktor nicht aufgerufen wird. Mein Problem ist, dass die GC nicht wissen kann, dass ich die nichtverwalteten Resourcen der Parent-Instanz noch benötige, wenn nur noch mit der Child-Instanz weitergearbeitet wird.

Würde es reichen, wenn ich in meiner Klasse eine öffentliche Eigenschaft 'Parent' vom Typ der Klasse implementiere und diese in der Methode 'CreateChild' für das zurückgegebene Objekt mit 'this' initialisiere, so dass die GC diese Verbindung sieht?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 20.01.12 13:05 
Hallo Karsten :welcome:

also du willst verhindern, daß die Parent-Instanz vom GC vorzeitig abgeräumt wird (und somit dessen Finalizer aufgerufen wird)?
Ich denke, dann sollte wirklich eine Parent-Eigenschaft beim Child ausreichen, um die Abhängigkeit dem GC mitzuteilen.

Du kannst ja mal schauen, was passiert wenn du zu Debugzwecken ein GC.Collect() ausführst - du siehst dann ja, ob der Finalizer aufgerufen würde.
Karsten_ Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 20.01.12 13:50 
Hallo Th69,

danke für den Tipp mit GC.Collect(). Es scheint tatsächlich auszureichen, diese Parent-Eigenschaft zu haben.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 20.01.12 17:55 
Ein privates Feld würde es auch tun ;) . Allerdings würde ich gar nicht die Ressourcen kopieren, sondern sie über eben diese Parent-Referenz ansprechen. Ohne Duplizierung der Ressourcen kann so ein Problem gar nicht entstehen.

_________________
>λ=
Karsten_ Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 20.01.12 18:25 
Hallo Kha,

danke für deine Antwort.

Bei den unverwalteten Resourcen handelt es sich um eine Buffer-ID einer unmanaged C-Bildverarbeitungs-Library. Bei der Erzeugung der Child-Instanz werden keine Resourcen kopiert; es gibt lediglich eine neue ID auf die Buffer-Resource (ein Child-Image). Solange 'Child' lebt, dürfen die Parent-Resourcen nicht freigegeben werden, da es sich letztendlich um denselben Speicher handelt. Wenn ich 'Child' nur über Parent ansprechbar mache, müßte ich zu Eigenschaft wie z.B. 'Width' und 'Height' noch 'Child-Width',... hinzufügen, was ich nicht möchte. Das hätte ich wohl noch ausführlicher beschreiben sollen.