Я использую функцию с несколькими путями возврата.Но на каждом из них мне нужно очистить память, освободить некоторые объекты и т. Д.Я видел в Интернете некоторые методы, но я не думаю, что они являются «стандартными» или даже безошибочными (goto
заявления).Я считаю, что это обычная ситуация, и она может оказаться полезной для других с такой же проблемой.
Вот пример:
//Opening many handles//
//.....
//The actual code
void *imgBytes;
bmp = CreateDIBSection(memHDC, &bmpInfo, DIB_RGB_COLORS, &imgBytes, NULL, NULL);
HGDIOBJ oldSelect = SelectObject(memHDC, bmp);
BitBlt(memHDC, 0, 0, screenW, rowHeight, screen, 0, yOffset, SRCCOPY);
GdiFlush();
//Memory leaks
if(!condition1) return false;
if(!condition2) return false;
if(!condition3) return false;
if(!condition4) return false;
if(!condition5) return false;
if(!condition6) return false;
//Code to be executed on every return
SelectObject(memHDC, oldSelect);
DeleteDC(memHDC);
DeleteObject(bmp);
ReleaseDC(NULL, screen);
Одним из решений этой проблемы может быть просто вставить каждыйif
внутри другого (но я не решаю проблему):
if(condition1){
if(condition1){
if(condition1){
if(condition1){
//continue execution...
return true;
}
}
}
}
//One of the conditions above failed. Clean code
SelectObject(memHDC, oldSelect);
DeleteDC(memHDC);
DeleteObject(bmp);
ReleaseDC(NULL, screen);
return false;
Как я могу решить эту проблему, но без goto's
.