[WinApi/GDI] Wyciek pamięci.

0

Witam, w jaki sposób można określić w którym miejscu programu następuje wyciek pamięci? Przeanalizowałem kod mojego programu (trochę sporawy) ale niestety nie mogę nigdzie znaleźć gdzie wyplywa. A to wszystko przy korzystaniu z GDI.

Podczas odrysowania na pewno jest wyciek, ale nie mogę go zlokalizować, oto kod odpowiedzialny za jego odrysowanie:

DC hdcBufor;
	HBITMAP hbmBuf, hbmOldBuf;

	PAINTSTRUCT ps;

	HDC hDC = NULL;
	hDC = BeginPaint( m_hWnd, &ps );
	
		hdcBufor = CreateCompatibleDC( hDC );
		hbmBuf = CreateCompatibleBitmap( hDC, ps.rcPaint.right, ps.rcPaint.bottom );
		hbmOldBuf = ( HBITMAP ) SelectObject( hdcBufor, hbmBuf );

		RECT rc = ps.rcPaint;

		FillRect(hdcBufor, &rc, ( HBRUSH ) GetStockObject( WHITE_BRUSH ) );


		BitBlt ( hDC, 0, 0, ps.rcPaint.right, ps.rcPaint.bottom, hdcBufor, 0, 0, SRCCOPY );
		SelectObject( hdcBufor, hbmOldBuf );

		DeleteObject ( hbmBuf );

	EndPaint( m_hWnd, &ps );
	ReleaseDC( m_hWnd, hDC );
0

Gdzie usuwasz hdcBufor?

0

O, to mi umknęło, ok dzięki już to nie powoduje wycieku, natomiast nie wszystkie usunąłem.

Czy coś takiego może powodować wyciek:

for ( std::vector<CManager*>::iterator it = m_mgrs.begin(); it != m_mgrs.end(); ++it )
{
	(*it)->LMouseButtonUp( hWnd, message, wParam, lParam );
}

Zakładając że metoda LMouseButtonUp nic nie robi?

Albo jeżeli tworzę obiekt dynamicznie w jednej funkcji i usuwam go w innej nie powoduje wycieku?, np:

Obiekt* o = new Obiekt;

a w innej funkcji która jako argument dostaje ten wskaznik:

void usun(Obiekt* o)
{
	delete o;
 	o = NULL;
}

Bardzo przydałyby mi się rady jak pisać by nie doprowadzać do wycieku pamięci.


After a while...
Udało mi się zlokalizować wszystkie wycieki (mam taką nadzieję) właściwie to poza tym hdcBufor to miałem jeszcze jeden takiej postaci:

BOOL costam()
{
  Obiekt* o = new Obiekt;
  //...
  if (warunek1)
  {
    //...
   return FALSE;
  }
  //...
  
  if (warunek2)
  {
    //...
   return FALSE;
  }

  delete o;
  o = NULL;

  return TRUE;
}

Rozwiązałem to tak:

BOOL costam()
{
  Obiekt* o = new Obiekt;
  BOOL result = TRUE;
  //...
  if (warunek1)
  {
    //...
   result = FALSE;
  }
 else
 {
    //...
  
    if (warunek2)
    {
      //...
     result = FALSE;
    }
  }
  delete o;
  o = NULL;

  return result;
}

Mimo wszystko jakieś rady by się przydały.

0

Czy coś takiego może powodować wyciek:

Nie.

Albo jeżeli tworzę obiekt dynamicznie w jednej funkcji i usuwam go w innej nie powoduje wycieku?

Nie. Nie ma znaczenia to, gdzie usuwasz.

Bardzo przydałyby mi się rady jak pisać by nie doprowadzać do wycieku pamięci.

W C++ korzystać ze standardowych kontenerów, inteligentnych wskaźników itd. Nie tworzyć obiektów na stercie, jeśli nie ma takiej potrzeby (vide twoja funkcja costam i obiekt o).

0

Takie tworzenie w jednej funkcji a zwalnianie w innej jest właśnie częstym powodem powstawania wycieków. Staraj się o ile to jest możliwe, tworzyć i usuwać w tej samej funkcji / klasie / ogólnie w tym samym miejscu. Np.:

//ŹLE
void Foo()
{
   Obiekt* o = new Obiekt();
   Bar(o);
}
void Bar(Obiekt *o)
{
   //roz cos z obiektem o
   delete o;
}

//DOBRZE
void Foo()
{
   Obiekt* o = new Obiekt();
   Bar(o);
   delete o;
}
void Bar(Obiekt *o)
{
   //roz cos z obiektem o
}
0

Dzięki za odpowiedzi i rady. Na pewno okażą się pomocne : ).

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