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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2012, 17:56   #1
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию Как очистить указатель?

Здравствуйте. Вот есть некие код, который вроде бы и работает но при работе наблюдается лавинообразный эффект поглощения памяти.
Подскажите как в данном случае можно освобождать память?Или где по вашему мнению утечка? Есть мнение что вся проблема в BYTE* bitPointer, но как его очистить? В мануалах ничего найти не смог. Спасибо.
Реализация в win application.

stdafx.h
Код:
#pragma once
#include<windows.h>

class A
{

private:
	BYTE* bitPointer;
	RECT windowRect;
	BITMAPINFO info;
	BITMAP* pBitmap;
	HWND window;
public:
	bool IsIt(int x, int y, DWORD z);
	void Fight(void);
};
stdafx.cpp
Код:
#include "stdafx.h"
#include <windows.h>
#include <time.h>
//#include <vld.h>

#define MAX_HEIGHT 620
#define MAX_WIDTH 1440

void A::Fight(void)
{
	Sleep(4000);
	while(IsIt(431,422,10083820) || IsIt(211,205,5397860))
	{
	Sleep(1000);
	SetCursorPos(458,464);
	mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
	mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
	if (IsIt(444,368,47226)) {exit(1);}
	}
	
}

bool A::IsIt(int x, int y, DWORD z)
{
	DWORD DWORD1;
	window = GetDesktopWindow();
    GetWindowRect(window, &windowRect);
    int bitmap_dx = windowRect.right-windowRect.left;
    int bitmap_dy = windowRect.bottom-windowRect.top;
    BITMAPINFOHEADER &bmpInfoHeader = info.bmiHeader;
    bmpInfoHeader.biSize = sizeof(bmpInfoHeader);
    bmpInfoHeader.biWidth = MAX_WIDTH;
    bmpInfoHeader.biHeight = MAX_HEIGHT;
    bmpInfoHeader.biPlanes = 1;
    bmpInfoHeader.biBitCount = 32;
    bmpInfoHeader.biCompression = BI_RGB;
    bmpInfoHeader.biSizeImage = bmpInfoHeader.biWidth*bmpInfoHeader.biHeight*(bmpInfoHeader.biBitCount/8);
    bmpInfoHeader.biXPelsPerMeter = 0;
    bmpInfoHeader.biYPelsPerMeter = 0;
    bmpInfoHeader.biClrUsed = 0;
    bmpInfoHeader.biClrImportant = 0;
    HDC winDC = GetWindowDC(window);
    HDC bmpDC = CreateCompatibleDC(winDC);
    HBITMAP bitmap = CreateDIBSection(winDC, &info, DIB_RGB_COLORS, (void**)&bitPointer, NULL, 0);
    SelectObject(bmpDC, bitmap);//Выбираем в контекст битмэп
    BitBlt(bmpDC, 0, 0, MAX_WIDTH, MAX_HEIGHT, winDC, 0, 0, SRCCOPY);
	DWORD1 = GetPixel(winDC,x,y);
	if (DWORD1 == z) {return true;} else {return false;}
    ReleaseDC(window, winDC);
}

Последний раз редактировалось CWD; 23.08.2012 в 21:41.
CWD вне форума Ответить с цитированием
Старый 23.08.2012, 22:15   #2
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

Деструктора не хватает.
Ёж птица гордая, пока не пнешь не полетит.
Ezhuk вне форума Ответить с цитированием
Старый 23.08.2012, 23:00   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Открываем документацию и читаем про CreateDIBSection - что надо делать с полученным HBITMAP когда закончим?

Кстати, вы выбрали самый сложный способ прочитать пиксель... Зачем копировать *все* окно, можено сделать GetPixel() прямо из winDC
waleri вне форума Ответить с цитированием
Старый 23.08.2012, 23:42   #4
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию

waleri HBITMAP удаляется, но утечка продолжается.
Код:
DeleteObject(bitmap);
Как оказалось вся проблема в строке, но что не так?
Код:
HBITMAP bitmap = CreateDIBSection(winDC, &info, DIB_RGB_COLORS, (void**)&bitPointer, NULL, 0);

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

ReleaseDC так же выполняется не всегда.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.08.2012, 01:44   #6
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию

Пепел феникса, находил много жалоб на утечку памяти в этой строке на других форумах, но к сожалению не нашел решений. Думал может кто сталкивался с такой штукой.

Если строку закоментить то проблема с утечкой решается
Код:
HBITMAP bitmap = CreateDIBSection(winDC, &info, DIB_RGB_COLORS, (void**)&bitPointer, NULL, 0);
.

Но очень она нужна эта строка.
CWD вне форума Ответить с цитированием
Старый 24.08.2012, 08:59   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас сначала выполняется return.
до ReleaseDC не доходит выполнение.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.08.2012, 11:45   #8
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию

Пепел феникса, спасибо! Проблема была именно в этом месте.

P.S. Проблема решена, а была она в криворукости Топик Стартера.
CWD вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как очистить экран? shrek1993 Visual C++ 2 18.07.2012 21:34
как очистить массив??? yura_zb Общие вопросы C/C++ 4 02.05.2011 21:43
Как очистить Canvas? beegl Общие вопросы Delphi 4 30.05.2008 02:51
Как очистить Canvas? Pro_BerSerK Общие вопросы Delphi 9 30.01.2008 16:03
как очистить экран doncova1 Общие вопросы C/C++ 3 18.03.2007 09:50