Ostatnio czytam sobie o tworzeniu dynamicznej allokacji pamięci i natknąłem się na bardzo ciekawy wątek.
int *wsk = new int(5); //tworzymy sobie obiekt o wartości 5
int *wsk2 = new int(10); //tym razem o wartości 10
//pracujemy sobie na obiektach...
//... i je zwalniamy, lecz wcześniej wykonaliśmy taką instrukcje
wsk2 = wsk; //odtąd wskaźnik wsk2 pokazuje na to na co wsk
delete wsk;//Zwalniamy obiekt wsk i tym samym zwalniamy jakąś część pamięci
//Tutaj nadal pracujemy tworząc nowe obiekty(nie koniecznie dynamiczne). Jeden obiekt zapisany jest w //tym miejscu, co dawniej wsk.
delete wsk2;//HORROR! - zwalniamy powtórnie ten sam adres! Omyłkowo zostaje zniszczony //przypadkowy obiekt
Pewnie dla niektórych jest to oczywiste, ale jak to ma się do WINAPI? Otóż odniosłem tworzenie dynamiczny obiektów, do tworzenia i zwalniania obiektów w WINDOWS.
HDC hdcKontekst = GetDC(hWindow);
//tworzymy sobie jakieś tam pióro...
HPEN pioro = CreatePen(PS_SOLID, 3, RGB(0,200,0));
//... i wiążemy z kontekstem, automatycznie usuwając stare pióro.
DeleteObject( SelectObject(hdcKontekst, pioro) );
ReleaseDC(hWindow, hdcKontekst);
DeleteObject(pioro);//BŁĄD???
Jak wiadomo, obiekty powiązane z kontekstem giną w chwili jego opuszczenia(w tym przypadku obiekt pioro), a ja dalej ponownie go usuwam. Lubię stosować takie zapisy ponieważ kod jest w tedy przejrzystszy i według tutorialu, który czytam jest to poprawne. Sumienie jednak nie daje mi spokoju, dlatego pytam o wasze zdanie.
P.S Zwykle jeszcze zapisuje sobie stan kontekstu, a potem go przywołuje, w razie gdybym o czymś zapomniał, a na koniec usuwam(DeleteObject) wszystkie utworzone przez siebie objekty.