Solved

CreateCompatibleDC and Memory leak question

Posted on 2009-05-05
11
847 Views
Last Modified: 2013-12-21
I am investigating a memory leak in my Windows Mobile application (Program just freezes from time to time).  I have read that when you no longer need a memory device context (such as CreateCompatibleDC) then  call the DeleteDC function to delete it.

I have an OnPaint function as follows:
void CMyClass::OnPaint()
{
      CBitmap bmp;
       BITMAP bi;
       CClientDC dc(this);
       CDC bmDC;

       bmp.LoadBitmap(IDB_MYBITMAP);
       bmDC.CreateCompatibleDC(&dc);
       CBitmap *pOldbmp = bmDC.SelectObject(&bmp);
       bmp.GetBitmap(&bi);
       dc.BitBlt(xPos, yPos, bi.bmWidth, bi.bmHeight, &bmDC, 0, 0, SRCCOPY);

}


I do not have any DeleteDC function here, where should it go and do you think the above could cause my app to crash due to memory leak over a period of time?
0
Comment
Question by:Wanting2LearnMan
  • 5
  • 2
  • 2
  • +2
11 Comments
 
LVL 31

Accepted Solution

by:
Zoppo earned 300 total points
ID: 24304241
Hi Wanting2LearnMan,

you need to select the 'old' bitmap back into the DC to avoid GDI leaks, so just after the 'BitBlt' call 'bmDC.SelectObject( pOldbmp );'.

The 'bmp' and 'cmDC' then should be release correctly with there destructors getting called.

Hope that helps,

ZOPPO
0
 
LVL 19

Assisted Solution

by:alb66
alb66 earned 100 total points
ID: 24304242
DeleteDC should be automatically called by the CDC destructor so, in my opinion, it is not the problem.
0
 
LVL 40

Assisted Solution

by:evilrix
evilrix earned 100 total points
ID: 24304251
>> do you think the above could cause my app to crash due to memory leak
Unless it's running out of memory and being terminated by the OS, it's very rare for an app to crash just due to a leak. Can you clarify specifically what you mean by "crash"?
0
ScreenConnect 6.0 Free Trial

At ScreenConnect, partner feedback doesn't fall on deaf ears. We collected partner suggestions off of their virtual wish list and transformed them into one game-changing release: ScreenConnect 6.0. Explore all of the extras and enhancements for yourself!

 
LVL 31

Assisted Solution

by:Zoppo
Zoppo earned 300 total points
ID: 24304274
> Unless it's running out of memory and being terminated by the OS, it's very rare for an app to crash just due to a leak

With memory leaks you're right, but GDI leaks can cause quite strange effects, even the OS may crash or behave strange since GDI resources are system-wide restricted.

ZOPPO
0
 

Author Comment

by:Wanting2LearnMan
ID: 24304413
Thanks guys.  Users of my app have told me that the program just 'froze' on them when they were using it.  Out of about 25 users 5 have told me this.  They have told me that they were 'just using it' and have not been able to say exactly the steps they took.  So I'm, tryin to look at all possibilities going through my code.
0
 

Author Comment

by:Wanting2LearnMan
ID: 24304919
Is there any way of monotoring in code how much free memory an app has to use.  If so then I could output the available memory at various stages and see if memory is getting leaked anywhere.

I am using eVC++ so debugging my app is tricky.
0
 
LVL 33

Expert Comment

by:pgnatyuk
ID: 24313734
The effect with your is exactly the GDI leak.
After BitBlt you have to select the old HBITMAP and delete DC you created. Something like that:
tmDC.SelectObject(pOldbmp);
bmDC.DeleteDC();
I don't understand why you need CClientDC? And CDC. You are in OnPaint. You should you CPaintDC only.
I'm afraid the MFC confuses not only you in OnPaint. Without MFC it looks simple:
PAINTSTRUCT paint = {0};
HDC hDC = BeginPaint(hWnd, &paint);
//Here is your code drawing on this hDC
EndPaint(hWnd, &paint);
0
 

Author Comment

by:Wanting2LearnMan
ID: 24318814
>>The effect with your is exactly the GDI leak.
What do yo umean by this?  Do you mean that you think this is the reason my app is 'freezing' thanks.

>>I don't understand why you need CClientDC? And CDC. You are in OnPaint. You should you CPaintDC only.
I wrote this about 2 years ago, I think I copied it off another example code, I'm not an expert on MFC drawing so I may be wrong to use this.
0
 

Author Comment

by:Wanting2LearnMan
ID: 24318921
Oh and yes its in the OnPaint() function
0
 

Author Comment

by:Wanting2LearnMan
ID: 24319080
ONe more question,

Do I need to do:
bmp.DeleteObject();

for the CBitmap bmp?

Thanks
0
 
LVL 33

Expert Comment

by:pgnatyuk
ID: 24322346
I'd prefer to call DeleteObject. I don't know if it happens from the destructor.
With GDI I prefer to set everything explicitly.
You may load this bitmap only once when you create your object and delete it whe you are destroying the object. If you will not see your picture - you have a leak - probably forgot to select the OldBitmap after the drawing
bmDC.SelectObject(pOldbmp);
only after this line you can delete your bitmap and DC.
GDI object selected in a DC is not deleted as well as the DC.
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
twoTwo  challenge 35 103
sumHeights2  challenge 7 107
How to split this in C++ 4 102
Autosar OS Multicore Share Resources confusion ? 2 40
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
Let me explain this picture a little bit.  First, in case you haven't already guessed, you are looking at my 2 phones, an Android Samsung Galaxy S5 on the left and an iPhone 5 on the right.  They are on their respective cradles on my desk.  But, you…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.

803 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question