webForumDet fria alternativet

När uppstår resursläckage?

C/C++

9 svar · 275 visningar · startad av Bratte

Medlem sedan feb. 200240 inlägg
Frågan#1

Om jag allokerar en resurs (tex SelectObject(dc,MyPen)) inne i en frekvent upprepad "Window Message" (tex WM_PAINT) måste jag då frigöra resursen med "DeleteObject" innan jag returnerar. Eller räcker det att jag frigör resurserna när jag stänger applikationen(i WM_CLOSE/WM_DESTROY) för att inte ett resursläckage ska uppstå?

Medlem sedan aug. 2001723 inlägg
#2

Frigör resurserna innan du returnerar. Ett tips är att kapsla in all sådan resursallokering i klasser som gör "SelectObject" i konstruktorn och "DeleteObject" i destruktorn. Då räcker det med att skapa ett sådant objekt inne i det kodblock eller den funktion som utförs/anropas när WM_PAINT skickas och sedan faller det ut ur "scope" och resursen frigörs "av sig själv".

Medlem sedan okt. 20013 217 inlägg
#3

Jag tycker det låter extremt farligt att allokera saker i en messagehandler, speciellt en som anropas hur många gånger som helst.

Medlem sedan aug. 2001723 inlägg
#4

Och faran är...?

Medlem sedan juni 200010 432 inlägg
#5

Faran ligger väl i programmeringsstilen som lätt genererar svårhittade fel. Speciellt viktigt när man jobbar i större projekt då kanske andra sitter och jobbar med ens kod. Kodning "ska" ju generellt sett utföras på ett sätt som minimerar riskerna.

Medlem sedan okt. 20013 217 inlägg
#6

Faran är att allokering tar tid och WM_PAINT kommer i massor så fort man ens rör musen över fönstret. Generellt sett så ska man försöka göra så lite som möjligt i eventhandlers, speciellt VM_PAINT.

Medlem sedan maj 20021 466 inlägg
#7

Frigör man allt man allokerar så är det nog inga större problem. Allting i ett Windows-program styrs ifrån event-handlers. Skulle man förbjudas att allokera något i dem blir det väldigt svårt att skriva ett program.

Att allokera minne tar inte alls så lång tid. Med dagens snabba datorer kan du allokera extremt många gånger innan det blir märkbart.

Detta är mina erfarenheter.

Medlem sedan okt. 20013 217 inlägg
#8

Man ska minimera tiden i eventhandlern. Det är tom en rekommendation utfärdad av Microsoft själva. Man kan ju få andra störningar som gör att man inte avallokerar resurserna korrekt. I windows är det ju inte enbart frågan av minne. Det kan vara handles till fönster, menyer, filer etc. Man får extremt svårdebuggade fel då man får slut på resurser. T ex så kan man få upp menyer utan text etc.

Medlem sedan feb. 200240 inlägg
#9

Om jag inte misstar mig så uppdateras inte WM_PAINT eller de andra WindowsMessage-erna så fruktansvärt ofta i förhållande till datrorns klockfrekvens, som några av de ovanstående skribenterna antyder. Sedan är väl et ganska centralt prejudikat i C++ att man ska nestla sina variabler, jag kan inte förstå varför denna regel inte skulle gälla här.

Medlem sedan okt. 20013 217 inlägg
#10

Kolla med verktyget Spy+ så ser du uppdateringen. Man får meddelandet så fort man för musen över fönsteret, så fort man rör på fönstret, så fort något annat fönster överlappar. Dvs rätt så ofta. Sätt en brytpunkt i eventhandlern så ser du att man kommer dit så fort nått som har med att fönstret ska ritas om inträffar.

255 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)