Probelm z pamięcia po modyfikacji programu

0

Witam,
otóż przerobiłem sobie program dodając do programu taki kod:

HBITMAP CreateBitmapMask(HBITMAP hbmColour, COLORREF crTransparent)
{
 HDC hdcMem, hdcMem2;
 HBITMAP hbmMask, hbmOld, hbmOld2;
 BITMAP bm;

 GetObject(hbmColour, sizeof(BITMAP), &bm);
 hbmMask = CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL);

 hdcMem = CreateCompatibleDC(NULL);
 hdcMem2 = CreateCompatibleDC(NULL);

 hbmOld = (HBITMAP)SelectObject(hdcMem, hbmColour);
 hbmOld2 = (HBITMAP)SelectObject(hdcMem2, hbmMask);

 SetBkColor(hdcMem, crTransparent);

 BitBlt(hdcMem2, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
 BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem2, 0, 0, SRCINVERT);

 SelectObject(hdcMem, hbmOld);
 SelectObject(hdcMem2, hbmOld2);
 DeleteDC(hdcMem);
 DeleteDC(hdcMem2);

 return hbmMask;
}

i do funkcji która jest wykonywana co pewien czas

string strEmotionBmpPath;
 	try {
		SimpleXML xml;
		xml.fromXML(File("EmoPacks\\Kolobok.xml", File::READ, File::OPEN).read());
		if(xml.findChild("Emoticons")) {
			xml.stepIn();

			while(xml.findChild("Emoticon")) {
				tstring strEmotionText = Text::toT(xml.getChildAttrib("PasteText"));
				if (strEmotionText.empty()) {
					strEmotionText = Text::toT(xml.getChildAttrib("Expression"));
				}
				
				strEmotionBmpPath = xml.getChildAttrib("Bitmap");
				if (!strEmotionBmpPath.empty()) {
					if (strEmotionBmpPath[0] == '.') {
						strEmotionBmpPath = "EmoPacks\\" + strEmotionBmpPath;
					} else {
						strEmotionBmpPath = "EmoPacks\\" + strEmotionBmpPath;
					}

int rrrr=chat->getLineCount()-1;
unsigned offset;
for(int yu=chat->getFirstVisibleLine();yu<=rrrr;yu++){
tstring finder=chat->getLine(yu);
int position = finder.find(strEmotionText, offset );
try {
if(position>0)
{
 HBITMAP hbmObraz;
 HBITMAP hbmMaska;
 BITMAP bmInfo;
 HWND hwnd=chat->handle();
 hbmObraz = (HBITMAP) ::LoadImage(0, Text::toT(strEmotionBmpPath).c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
 //tworzymy do niej maskę
 hbmMaska = CreateBitmapMask(hbmObraz, RGB(0,0,0));
 //pobieramy jej wymiary i zapamiętujemy je
GetObject(hbmObraz, sizeof(bmInfo), &bmInfo);
 //tworzymy rozmaite pomocnicze bufory 
 HDC hdc = GetDC(chat->handle());
 HDC hdcNowy = CreateCompatibleDC(hdc);

 GetObject(hbmObraz, sizeof(bmInfo), &bmInfo);

 SelectObject(hdcNowy, hbmMaska);
 if(position>30 and position<60)
  BitBlt(hdc, position*4.98,(yu-chat->getFirstVisibleLine())*13, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCAND);
 else if(position>60)
   BitBlt(hdc, position*4.77,(yu-chat->getFirstVisibleLine())*13, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCAND); 
 else
   BitBlt(hdc, position*4.9,(yu-chat->getFirstVisibleLine())*13, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCAND); 
   
 SelectObject(hdcNowy, hbmObraz);
 if(position>30 and position<60)
   BitBlt(hdc, position*4.98,(yu-chat->getFirstVisibleLine())*13, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCPAINT);
 else if(position>60)
  BitBlt(hdc, position*4.77,(yu-chat->getFirstVisibleLine())*13, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCPAINT);
 else
  BitBlt(hdc, position*4.9,(yu-chat->getFirstVisibleLine())*13, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCPAINT);
 ReleaseDC(hwnd, hdc); 
} 
} catch(const Exception& e) {}    
 }  
				}
			}
			xml.stepOut();
		}
 	} catch(const Exception& e) {}         
}
}

i po włączeniu programu program działa ale po jakimś czasie(nie zawsze taki sam) wyskakuje błąd i pisze
[...]Pamięć nie może być "read"[...]

Czy ktoś może wie czym to jest spowodowane?? i jak to naprawić??

0

sprawdz memtestem bo to nie błąd programu a pamieci: http://www.memtest.org/

0

tylko ze ten komunikat odwołuje się do pamięci w programie a nie do mojego komputera,
przed modyfikacją jest ok.
po modyfikacji mówi
Instrukcja spod xxxxxxxxxx odwołuje się do pamięci pod adresem yyyyyyyyyyyy. Pamięc nie może być "read"

i teraz nie wiem w czym problem. i jak go naprawić

0

pobaw się z try{} i catch{}

0

dodałem takie coś w try dodałe cały kod a w catch() dałem

::MessageBox(NULL, Text::toT(e.what()).c_str(),Text::toT("Wiadomość").c_str() , MB_ICONINFORMATION | MB_OKCANCEL);

lecz nic to nie dało :(
nadal wyskakuje ten bład i nic innego

OllyDbg wskakuje na :

006609AF . FF70 FC PUSH DWORD PTR DS:[EAX-4] ; /block
006609B2 . E8 99920000 CALL <JMP.&msvcrt.free> ; \free

0

czyli wychodzi na to, ze FREE zauwaza 'uszkodzony' blok pamieci -- np. zostal juz on wczesniej zwolniony, albo cos wyszlo kiedys z zapisem poza-tablice i teraz okolice bloku sa uszkodzone..

hehhe.. sluchaj.. a czy aby Text::toT nie uzywa jakiegos statycznego bufora? moze oba Text::toT uzywaja tego samego bufora i c_str() wariuje? odbierz oba napisy po-konwersji do jakichs roznych zmiennych i potem podaj je do MBox. potem przestepuj sie przez ten fragment i sprawdz, DOKLADNIE w ktorej linii sie wywali. pokaz te linie i po kilka linii przed/po.

1 użytkowników online, w tym zalogowanych: 0, gości: 1