Entwickler-Ecke

Multimedia / Grafik - Bild laden und freigeben


Delete - Mi 01.05.13 16:16
Titel: Bild laden und freigeben
- Nachträglich durch die Entwickler-Ecke gelöscht -


Delete - Mi 01.05.13 20:36

Keine Ahnung von C oder .net, aber in Delphi wird lediglich für das Erzeugen der Komponente Speicher angefordert und beim Zerstören des Objekts wieder freigegeben – und auch das nur, wenn man die Komponente zur Laufzeit erst erzeugt. Wenn deine Komponente, diese mir unbekannte BildBox, eine LoadfromFile-Methode besitzt, mußt du dich bestimmt nicht selber darum kümmern, sonst wäre das eine lausige Bildanzeige-Komponente.


Delete - Mi 01.05.13 21:01

- Nachträglich durch die Entwickler-Ecke gelöscht -


jfheins - Mi 01.05.13 21:03

Zitat:
Müsste ich nicht vor jedem Ladevorgang ein Bild freigeben, bevor ich das nächste lade?

Musst du nicht, kannst du aber.

das ist in der Regel nicht nötig, weil der Garbage Collecor (GC) das ganze automatisch erledigt. Ich habe mal eine Bildverarbeitung geschrieben, wo ich nichts mit Dispose freigegeben habe, das hat funktioniert. Leider hat es auch die vollen 8 GB RAM genutzt ^^ Jetzt ein Dispose an der passenden Stelle und der RAM Verbrauch bleibt im Rahmen.

Es gibt natürlich Klassen (insb. Sachen die mit Grafik zu tun haben) da sollst du Dispose aufrufen, wenn du die nicht mehr brauchst. Generell gilt, wenn die Klasse IDisposable implementiert, solltest du nach Benutzung .Dispose() aufrufen oder direkt ein using(){} verwenden. Weil der GC zwar seine Arbeit selbstständig macht, aber er macht sie dann eben auch wann er will.

Siehe auch http://msdn.microsoft.com/de-de/library/vstudio/system.idisposable.aspx


Martok - Mi 01.05.13 21:52

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Das Thema gehört verschoben !!
Hab ich dann mal gemacht ;-)


Delete - Mi 01.05.13 22:31

- Nachträglich durch die Entwickler-Ecke gelöscht -


jfheins - Do 02.05.13 01:01

Jein.

Das using erledigt das Dispose, ja. Aber es ist nicht gleichbedeutend mit dem was du da hast. Du musst immer eine Variable deklarieren und diese hat dann auch nur den Scope des using Staements.
Folgendes ist also equivalent:

C#-Quelltext
1:
2:
3:
4:
5:
using (var myRes = new MyResource())
{
    myRes.DoSomething();

}

und

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var myRes= new MyResource();
try
{
    myRes.DoSomething();
}
finally
{
    if (myRes!= null)
        ((IDisposable)myRes).Dispose();
}
// myRes fällt hier aus dem scope


D.h. in deinem konkreten Fall solltest du auf null prüfen und ggf. Dispose() aufrufen. (Weil das ja gar keine lokale Variable ist)


Delete - Do 02.05.13 01:59

- Nachträglich durch die Entwickler-Ecke gelöscht -