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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2009, 03:10   #1
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию Утечка памяти при работе с GDI+

Проблема банальна, обьект оказывается удаляется только частично - массив выделенный для хранения изображения не удаляется а остается висеть в память. Каким образом от него можно избавится?
На всякий случай приведу код:
Код:
#include "main.h"
using namespace Gdiplus;
void OnPaint(HDC hdc)
{
	Bitmap bmp(300,220);
	Graphics* gpBack=Graphics::FromImage(&bmp);
	Graphics graphics(hdc);
	Pen pen(Color(255, 0, 0, 255),4.0f);
	gpBack->DrawLine(&pen,0,0,0,200);
	graphics.DrawImage(&bmp,0,0);
}

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
{
	HWND                hWnd;
	MSG                 msg;
	WNDCLASS            wndClass;
	GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR           gdiplusToken;

	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

	wndClass.style          = CS_HREDRAW | CS_VREDRAW;
	wndClass.lpfnWndProc    = WndProc;
	wndClass.cbClsExtra     = 0;
	wndClass.cbWndExtra     = 0;
	wndClass.hInstance      = hInstance;
	wndClass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
	wndClass.hCursor        = LoadCursor(NULL, IDC_ARROW);
	wndClass.hbrBackground  = (HBRUSH)GetStockObject(BLACK_BRUSH);
	wndClass.lpszMenuName   = NULL;
	wndClass.lpszClassName  = L"GDIPHelloWorld";

	RegisterClass(&wndClass);

	hWnd = CreateWindow(
		TEXT("GDIPHelloWorld"),   
		TEXT("GDI+ Template"),  
		WS_OVERLAPPEDWINDOW,      
		CW_USEDEFAULT,            
		CW_USEDEFAULT,            
		320,            
		240,            
		NULL,                     
		NULL,                     
		hInstance,                
		NULL);     
	ShowWindow(hWnd, iCmdShow);
	UpdateWindow(hWnd);
	while(GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	GdiplusShutdown(gdiplusToken);
	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, 
						 WPARAM wParam, LPARAM lParam)
{
	HDC          hdc;
	PAINTSTRUCT  ps;

	switch(message)
	{
	case WM_TIMER:
		{
		InvalidateRect(hWnd,0,TRUE);
		}
	case WM_CREATE:
		{
		SetTimer(hWnd,1000,100,0);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		OnPaint(hdc);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
}
PS: Может быть у кого ни будь есть include-файлы для Native-ной работы? Т.е. просто с определениями структур, констант итд.итп - что б можно было из С работать.
"Тяжело в учении, легко в бою" - А.В. Суворов

Последний раз редактировалось Ivan_32; 28.11.2009 в 03:22.
Ivan_32 вне форума Ответить с цитированием
Старый 28.11.2009, 10:59   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
delete gpBack; // А то он же остаётся
или, может быть, вообще лучше
Код:
Graphics gpBack(&bmp);
?
Для native есть GdiPlusFlat.h - он вроде стандартный.
Somebody вне форума Ответить с цитированием
Старый 29.11.2009, 00:12   #3
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Код:
#pragma comment(lib,"gdiplus.lib")
#include <windows.h>
#include <ddraw.h>
#include <gdipluspixelformats.h>
#include <gdiplusenums.h>
#include <GdiplusTypes.h>
#include <GdiplusGpStubs.h>
#include <gdiplusimaging.h>
#include <gdiplusmetaheader.h>
#include <gdipluscolor.h>
#include <gdipluscolormatrix.h>
#include <GdiPlusFlat.h>
#include <GdiPlusInit.h>

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
        GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;   
	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
        /////////////////
        //GDI+ Code //
        ////////////////
        GdiplusShutdown(gdiplusToken);
	return 0;
}
Нашел решение, вот это похоже Native-ный способо. Но из C этот номер не прокатит, нужно все самому делать похоже. Жаль в С нет ручного импорта, как в FASM
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу понять, где утечка памяти (9 строчек) dueram Win Api 1 24.11.2009 19:56
Бешеное потребление виртуальной памяти при работе в Excel 2003 dikdm Microsoft Office Excel 2 28.04.2009 13:10
утечка памяти в С++ vengo Общие вопросы C/C++ 9 10.06.2008 21:24
Проблема при работе с БД HAMMAN БД в Delphi 3 29.03.2008 14:42
DrawState - утечка памяти? unnamed Win Api 2 11.04.2007 18:36