Очистить память при многократном возврате - функция C ++ - PullRequest
2 голосов
/ 24 апреля 2019

Я использую функцию с несколькими путями возврата.Но на каждом из них мне нужно очистить память, освободить некоторые объекты и т. Д.Я видел в Интернете некоторые методы, но я не думаю, что они являются «стандартными» или даже безошибочными (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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...