Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2010, 05:14   #1
ExPeL
 
Регистрация: 21.10.2010
Сообщений: 5
По умолчанию Проблема с утечкой памяти

ОС Windows 7 (64-разрядная), вроде на XP говорят работало нормально, но в этом факте не уверен. После 20-30 секунд работы - программа начинает жутко жрать память. Должен быть косяк в этом фрагменте, если что сильно не ругайте^^, я новичок и программа не моя, тупо сижу разбираюсь.

Код:
case WM_CREATE:
		{
			hdc = GetDC(hWnd);
			hdcClient = CreateCompatibleDC(hdc);
			ReleaseDC(hWnd, hdc); 
			hbrBkgnd = CreateSolidBrush(RGB(0, 255, 220));

			//Инициализция фигур
			Figure r1(0, 50, 50, 300, 100);
			Figure r2(0, 400, 20, 300, 180);
			Figure t1(1, 300, 300, 400, 300);
			Figure t2(1, 100, 400, 200, 100);

			//Добавление фигур в коллекцию фигур
			figures.Add(r1);
			figures.Add(r2);
			figures.Add(t1);
			figures.Add(t2);
			break;
		}
	case WM_PAINT:
		{			
			hdc = BeginPaint(hWnd, &ps);
			HBITMAP hBmp = CreateCompatibleBitmap(hdc, szClient.cx, szClient.cy);
			SelectObject(hdcClient, hBmp);
			HBRUSH hOld = (HBRUSH)SelectObject(hdcClient, hbrBkgnd);
			PatBlt(hdcClient, 0, 0, szClient.cx, szClient.cy, PATCOPY);

			figures.Draw(hdcClient);
			BitBlt(hdc, 0, 0, szClient.cx, szClient.cy, hdcClient, 0, 0, SRCCOPY);

			SelectObject(hdcClient, hOld);
			EndPaint(hWnd, &ps);
			break;
		}

	case WM_ERASEBKGND: return TRUE;

	case WM_LBUTTONDOWN:
		ClipCursor(&rClient);
		pOld.x = LOWORD(lParam);
		pOld.y = HIWORD(lParam);
		if (figures.IsCursorIn(pOld))
		{		
			figures.SetDifCoords(pOld);
			InvalidateRect(hWnd, 0, TRUE);
			bDrag = true;
		}
		break;

	case WM_MOUSEMOVE:
		{
			if (!(wParam & MK_LBUTTON))
				return 0;
			if(bDrag)
			{
				POINT p;
				p.x = LOWORD(lParam);
				p.y = HIWORD(lParam); 

				figures.Move(p);
				InvalidateRect(hWnd, 0, TRUE);
			}
			break;
		}

	case WM_LBUTTONUP:
		ClipCursor(0);
		figures.StopMove();
		bDrag = false;
		break;

	case WM_MOVE:
	case WM_SIZE:	
		{
			GetClientRect(hWnd, &rClient); 
			POINT ptLT = { rClient.left, rClient.top };
			POINT ptRB = { rClient.right, rClient.bottom };
			ClientToScreen(hWnd, &ptLT); 
			ClientToScreen(hWnd, &ptRB); 
			SetRect (&rClient, ptLT.x, ptLT.y, ptRB.x, ptRB.y);
			szClient.cx = rClient.right - rClient.left;
			szClient.cy = rClient.bottom - rClient.top;
			break;
		}

	case WM_DESTROY:
		DeleteObject(hbrBkgnd);
		DeleteDC(hdcClient);
		PostQuitMessage(0);
		break;

	default:				
		return DefWindowProc(hWnd,msg,wParam,lParam);
	}
	return 0L;

Последний раз редактировалось ExPeL; 21.10.2010 в 05:19.
ExPeL вне форума Ответить с цитированием
Старый 21.10.2010, 13:21   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
HBITMAP hBmp = CreateCompatibleBitmap(hdc, szClient.cx, szClient.cy);
битмап создаете а удалять его потом кто будет?(это в WM_PAINT)
и в XP поидее тоже утечки должны быть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.10.2010, 21:57   #3
ExPeL
 
Регистрация: 21.10.2010
Сообщений: 5
По умолчанию

Я догадывался что именно он косячит и даже делал попытки исправить, т.к. поиск юзал и там было по этому кое-что: типо на каждый create должен быть delete, и он на все create'ы был,кроме этого. Но как его толково удалить так и не понял, вносить в WM_DESTROY или в той-же WM_PAINT писать(разные примеры кодов видел)? И какую команду использовать - deleteObject(hBmp) пробовал, но это полная чушь вроде. Вообщем если можно, что куда написать, какой конкретно командой и что-нибудь почитать посоветуйте пожалуйста на С++, С# для базы начальной, буду очень признателен.
ExPeL вне форума Ответить с цитированием
Старый 21.10.2010, 22:01   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
	case WM_PAINT:
		{			
			hdc = BeginPaint(hWnd, &ps);
			HBITMAP hBmp = CreateCompatibleBitmap(hdc, szClient.cx, szClient.cy);
			SelectObject(hdcClient, hBmp);
			HBRUSH hOld = (HBRUSH)SelectObject(hdcClient, hbrBkgnd);
			PatBlt(hdcClient, 0, 0, szClient.cx, szClient.cy, PATCOPY);

			figures.Draw(hdcClient);
			BitBlt(hdc, 0, 0, szClient.cx, szClient.cy, hdcClient, 0, 0, SRCCOPY);

			SelectObject(hdcClient, hOld);
                                  DeleteObject(hBmp);
			EndPaint(hWnd, &ps);
			break;
		}
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.10.2010, 22:13   #5
ExPeL
 
Регистрация: 21.10.2010
Сообщений: 5
По умолчанию

Спасибо=) Все заработало нормально!
ExPeL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема при компиляции в Dev-C++: "инструкция ... обратилась к памяти ... Память не может быть read." Catharsis Общие вопросы C/C++ 3 14.05.2010 02:12
Проблема с виделением памяти! FreTFuL Общие вопросы C/C++ 1 07.05.2010 20:23
самописный assert: проблема с утечкой памяти) sashonk Общие вопросы C/C++ 2 26.04.2010 15:58
Проблема выделения динамической памяти в С++ oxygen90 Помощь студентам 3 14.09.2009 21:47
Выделение памяти antoha.by Паскаль, Turbo Pascal, PascalABC.NET 2 29.04.2008 20:04