/ / Wyciek pamięci z dodatkowych bajtów okna? - c ++, winapi, pamięć, wycieki pamięci

Wyciek pamięci z dodatkowych bajtów okna? - c ++, winapi, pamięć, wycieki pamięci

Tworzę okno klasy C ++ i używamdodatkowe bajty dla każdego utworzonego okna (przy użyciu cbWndExtra struktury WNDCLASSEX itp.) podczas rejestrowania klasy okna. Czy :: DestroyWindow (..) zwalnia dodatkowe bajty przydzielonego okna?

Wygląda na to, że kiedy tworzę i niszczę wiele obiektów okienkowych w pętli, wzrasta "Wielkość zatwierdzenia" mojej aplikacji w Menedżerze zadań.

Moja klasa C ++ nie przydziela żadnej pamięci,ponadto nie ma na nim żadnych kontrolek / pasków narzędzi / menu, nie wydaje się przeciekać żadnych obiektów GDI ani niczego podobnego, więc podejrzewam, że jest to coś z dodatkowymi bajtami okna.

Czy ktoś ma jakieś pomysły na to, co może pójść źle?

Czy jest jakieś API, które powinienem wywołać, aby zwolnić dodatkowe bajty?

Czy jest coś jeszcze, co musisz zrobić, niszcząc okno, które używa dodatkowych bajtów?

EDYTOWAĆ: Spróbowałem stworzyć tylko jedno okno konkretnej klasy, która używa dodatkowych bajtów i niszcząc ją w pętli i ponownie zwiększa się rozmiar zatwierdzenia mojej aplikacji. Czekałem też na kilka godzin, a wielkość zatwierdzenia wcale się nie zmniejszyła. Dodatkowe bajty zawierają tylko wskaźnik do obiektu, który reprezentuje okno. Ten obiekt zostanie zniszczony (zostanie utworzony statycznie w pętli). W każdym razie wygląda na to, że to nie moja wina i że może to nie być nawet błąd Windowsa (jak mówisz - chociaż nie jestem w 100% pewny), więc zamierzam go opuścić tak, jak jest ...

Odpowiedzi:

5 dla odpowiedzi № 1

Tak, uwalnia dodatkowe bajty. Może przechowujesz wskaźniki dla przydzielonej w nich pamięci, a to przecieka.

Również "Wielkość zobowiązania" nie spada, nie dowodziwyciek pamięci. Alokatorzy nie zwracają natychmiast zwalnianej pamięci do systemu operacyjnego, mogą ją zachować i później użyć ponownie. Spróbuj utworzyć prostą pętlę CreateWindowEx / DestroyWindow, aby zweryfikować.


0 dla odpowiedzi nr 2

Twoim zadaniem jest zwolnić pamięć, do której się odwołujeszprzez ustawienie pola cbWndExtra. Jeśli myślisz o tym, ma to sens, ponieważ system Windows nie ma wiedzy na temat tego, w jaki sposób pamięć została przydzielona w pierwszej kolejności (np. Malloc, new, LocalAlloc itp.)

EDYTOWAĆ: Odkąd miałem okazję, być może nie było to jasne. Jeśli włożysz wskaźnik na pole i wskaże coś, co zostało przydzielone w Twojej aplikacji, to pamięć nie zostanie zwolniona. Dodatkowe bajty będą, ale nie to, co wskazują.