Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: FAQ - MFC ::  Memory Leaks - GDI Objekte mit Create     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 7463
Beitrag Dravere Moderator 15:29:08 13.01.2006   Titel:   Memory Leaks - GDI Objekte mit Create            Zitieren

Guten Tag zusammen,

Mir ist da grad was passiert und ich bin nun vollends am Ende meines Lateins.
Ich habe eine MDI Anwendung geschrieben, welche auch prima funktioniert. Zumindest beim ersten Dokument. Wenn ich das erste Dokument schliesse und ein zweites erstelle, funktioniert das manchmal auch noch. Wenn das wieder geschlossen wird und ich wieder ein neues erstelle, dann funktionieren die ersten Dinge sicherlich nicht mehr. Die Werte im Hintergrund sind allerdings richtig gesetzt. Aber bei der Ausgabe, also bei OnDraw, fängt der völlig an zu spinnen. So kommt es mal vor, dass ein X irgendwo weit neben der MDI Anwendung auftaucht. Oder auch das Icon irgendwo plötzlich gezeichnet wird. Dabei bin ich in meinem Programm noch gar nicht soweit, dass ich irgendetwas an diesen Einstellungen verändert habe. (MDI Grundgerüst, habe ich natürlich vom Assistenten erstellen lassen). Wenn ich wieder das Dokument schliesse und ein neues eröffne, dann wird es langsam wirklich derb. So habe ich eine Dialogbox am Anfang beim öffnen. Diese erscheint nur noch als graue Box. Die Dinge sind zwar vorhanden, also durch wildes rumgeklicke findet man dann auch diese Checkboxes und Editfelder. Titelleiste und anderes sind dann meisten auch schon ganz verschwunden. Und bei jedem neuen Dokument wird es irgendwie noch schlimmer. Es passiert auch, wenn ich die Dokumente nicht schliesse, sondern einfach immer ein neues erstelle.

Zudem wird nicht nur das Childframe völlig inkorrekt gezeichnet, sondern auch das Mainframe bekommt Fehler. Hab ehrlich gesagt sowas noch nie gesehen und desweiteren hab ich doch an dem Zeugs gar nichts gemacht, dass kommt doch alles vom Assistenten. Kommt das irgendjemandem bekannt vor? Hat jemand eine Idee, wo ich nachschauen soll? Woran könnte dies liegen?

Mit Freundlichen Grüssen

Dravere :eek:


Zuletzt bearbeitet von estartu am 10:52:16 16.01.2006, insgesamt 1-mal bearbeitet
Werbeunterbrechung
estartu
Moderator

Benutzerprofil
Anmeldungsdatum: 05.09.2003
Beiträge: 11494
Beitrag estartu Moderator 15:49:23 13.01.2006   Titel:              Zitieren

Du reservierst dir (vermutlich beim Zeichnen) immer mehr Ressourcen, so dass irgendwann keine mehr frei sind. Und dann fängt das an komisch auszusehen.

Leider weiß ich nicht mehr, welche Befehle da alle dazugehörten...

_________________
Das c-plusplus.de-Magazin sucht Mitmacher --- Die Artikel --- meine Homepage
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 7463
Beitrag Dravere Moderator 15:52:16 13.01.2006   Titel:              Zitieren

interessant, das würde einen gewissen Zusammenhang bringen mit dem was ich gerade noch rausgefunden habe:
First-chance exception at 0x77e9bc3f in VerDraHaus.exe: Microsoft C++ exception: CResourceException @ 0x0012f1e4.
Warning: Uncaught exception in WindowProc (returning 0)

Anderst gesagt hätte das mit einem Speicherleck zu tun. Hmmm ...
Dann hätte ich vielleicht eine Idee ...
Vielen Dank erstmals, ich werde mal dieser Idee nachgehen und danach mich hier wieder melden.
Grüssli
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 7463
Beitrag Dravere Moderator 16:40:04 13.01.2006   Titel:              Zitieren

OK die Idee und eine vielzahl anderer Ideen hat bisher nichts gebracht.
Etwas begreife ich noch nicht ganz. Wenn ich ein Dokument öffne und es dann wieder schliesse, dann sollten doch alle Ressourcen darin verloren gehen, bzw. wieder zur Verfügung stehen. Aber dem scheint gar nicht so zu sein.
Wäre also dankbar für weitere Hilfe.
Grüssli
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 7463
Beitrag Dravere Moderator 14:00:32 14.01.2006   Titel:              Zitieren

Ok hab es gelöst. Falls es jemand interessiert,

Es ging um GDI Objekte, welche ich mit Create erstellt habe. Also zum Beispiel:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CFont font;
font.CreateFont(16,// nHeight
           0,// nWidth
           0,// nEscapement
           0,// nOrientation
           FW_NORMAL,// nWeight
           FALSE,// bItalic
           FALSE,// bUnderline
           0,// cStrikeOut
           ANSI_CHARSET,// nCharSet
           OUT_DEFAULT_PRECIS,// nOutPrecision
           CLIP_DEFAULT_PRECIS,// nClipPrecision
           DEFAULT_QUALITY,// nQuality
           DEFAULT_PITCH | FF_SWISS,// nPitchAndFamily
           "Arial");// lpszFacename

// oder direkt zu einem HFONT //


HFONT hfont = CreateFont(16,// nHeight
                    0,// nWidth
                    0,// nEscapement
                    0,// nOrientation
                    FW_NORMAL,// nWeight
                    FALSE,// bItalic
                    FALSE,// bUnderline
                    0,// cStrikeOut
                    ANSI_CHARSET,// nCharSet
                    OUT_DEFAULT_PRECIS,// nOutPrecision
                    CLIP_DEFAULT_PRECIS,// nClipPrecision
                    DEFAULT_QUALITY,// nQuality
                    DEFAULT_PITCH | FF_SWISS,// nPitchAndFamily
                    "Arial");// lpszFacename
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CFont font;
font.CreateFont(16,// nHeight
0,// nWidth
0,// nEscapement
0,// nOrientation
FW_NORMAL,// nWeight
FALSE,// bItalic
FALSE,// bUnderline
0,// cStrikeOut
ANSI_CHARSET,// nCharSet
OUT_DEFAULT_PRECIS,// nOutPrecision
CLIP_DEFAULT_PRECIS,// nClipPrecision
DEFAULT_QUALITY,// nQuality
DEFAULT_PITCH | FF_SWISS,// nPitchAndFamily
"Arial");// lpszFacename

// oder direkt zu einem HFONT //


HFONT hfont = CreateFont(16,// nHeight
0,// nWidth
0,// nEscapement
0,// nOrientation
FW_NORMAL,// nWeight
FALSE,// bItalic
FALSE,// bUnderline
0,// cStrikeOut
ANSI_CHARSET,// nCharSet
OUT_DEFAULT_PRECIS,// nOutPrecision
CLIP_DEFAULT_PRECIS,// nClipPrecision
DEFAULT_QUALITY,// nQuality
DEFAULT_PITCH | FF_SWISS,// nPitchAndFamily
"Arial");// lpszFacename
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CFont font;
font.CreateFont(16,// nHeight
           0,// nWidth
           0,// nEscapement
           0,// nOrientation
           FW_NORMAL,// nWeight
           FALSE,// bItalic
           FALSE,// bUnderline
           0,// cStrikeOut
           ANSI_CHARSET,// nCharSet
           OUT_DEFAULT_PRECIS,// nOutPrecision
           CLIP_DEFAULT_PRECIS,// nClipPrecision
           DEFAULT_QUALITY,// nQuality
           DEFAULT_PITCH | FF_SWISS,// nPitchAndFamily
           "Arial");// lpszFacename

// oder direkt zu einem HFONT //


HFONT hfont = CreateFont(16,// nHeight
                    0,// nWidth
                    0,// nEscapement
                    0,// nOrientation
                    FW_NORMAL,// nWeight
                    FALSE,// bItalic
                    FALSE,// bUnderline
                    0,// cStrikeOut
                    ANSI_CHARSET,// nCharSet
                    OUT_DEFAULT_PRECIS,// nOutPrecision
                    CLIP_DEFAULT_PRECIS,// nClipPrecision
                    DEFAULT_QUALITY,// nQuality
                    DEFAULT_PITCH | FF_SWISS,// nPitchAndFamily
                    "Arial");// lpszFacename

Es spielt dabei keine Rolle welche Art von GDI Objekte. Sobald man sie erstellt hat, muss man sie wieder löschen. Dies geht nicht automatisch. Die Funktion die man dazu aufrufen muss ist folgende:
C/C++ Code:
DeleteObject(HGDIOBJ hObject);
C/C++ Code:
DeleteObject(HGDIOBJ hObject);
C/C++ Code:
DeleteObject(HGDIOBJ hObject);

Ihr findet dazu auch was in der MSDN.

Beim mir war desweitern noch das Problem, dass ich das Handle gespeichert habe. Und zwar nicht nur eines, sondern ca. an die 200 - 300 Stück in einer Liste. Die meiner Meinung nach Beste Lösung hierbei ist es nicht die Handles zu speichern, sondern die Werte. So zum Beispiel, wieder beim CFont Objekt, gibt es die Struktur LOGFONT. Die könnt ihr ganz einfach mit CFont::GetLogFont(LOGFONT* pLog) holen.
C/C++ Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
CFont font;
LOGFONT lg;
font.GetLogFont(&lg);

// oder einsetzen //
font.CreateFontIndirect(&lg);

// dabei am Ende nicht vergessen //
DeleteObject(font);
C/C++ Code:
1
2
3
4
5
6
7
8
9
CFont font;
LOGFONT lg;
font.GetLogFont(&lg);

// oder einsetzen //
font.CreateFontIndirect(&lg);

// dabei am Ende nicht vergessen //
DeleteObject(font);
C/C++ Code:
1
2
3
4
5
6
7
8
9
CFont font;
LOGFONT lg;
font.GetLogFont(&lg);

// oder einsetzen //
font.CreateFontIndirect(&lg);

// dabei am Ende nicht vergessen //
DeleteObject(font);

Diese Sturkturen sind sowieso viel besser auch zum bearbeiten. In einem LogFont kann man die Grösse einfach ändern, während man bei einem CFont Objekt es so gut wie neu erstellen kann.

Dies alles gilt wie gesagt für GDI Objekte. Also solche wie CPen, CBrush, CFont, CBitmap, CRgn und CPalette.
Erstellt sie nur gerade zum zeichnen und löscht sie danach gleich wieder.

Ich hoffe ich werde ein paar Leuten, welche in die gleiche Sache hineinlaufen damit helfen können ^^'

Grüssli

PS: Danke estartu für die einzige Hilfe ;)


Zuletzt bearbeitet von Dravere am 14:01:29 14.01.2006, insgesamt 1-mal bearbeitet
estartu
Moderator

Benutzerprofil
Anmeldungsdatum: 05.09.2003
Beiträge: 11494
Beitrag estartu Moderator 19:59:43 14.01.2006   Titel:              Zitieren

Ich danke dir für die schöne Erklärung. :live: :)

_________________
Das c-plusplus.de-Magazin sucht Mitmacher --- Die Artikel --- meine Homepage
C/C++ Forum :: FAQ - MFC ::  Memory Leaks - GDI Objekte mit Create   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.