Получение значения проблемы итератора списка C ++ - PullRequest
0 голосов
/ 20 июля 2011

У меня есть такой код:

struct sWindowInfo {
    WNDPROC pPrevWndProc;
};
typedef std::list<sWindowInfo> windowsList;

И функция, которая возвращает указатель на итератор первой структуры window-info в списке:

windowsList::const_iterator* windowGet();

Код вроде этого работает нормально:

if (windowsList::const_iterator* itr = windowGet())
{
    WNDPROC wndProc = (*itr)->pPrevWndProc;        
    return CallWindowProc(wndProc, hWnd, msg, wParam, lParam);
}

Но если я попробую:

if (windowsList::const_iterator* itr = windowGet())
    return CallWindowProc((*itr)->pPrevWndProc, hWnd, msg, wParam, lParam);

Произошла ошибка во время выполнения, и я вижу странные значения в отладчике. Я не понимаю, почему? На мой взгляд, это идентичный код.

1 Ответ

1 голос
/ 20 июля 2011

Обе реализации неверны.Вы не должны возвращать указатели на итератор, так как он будет недействительным после вызова windowGet ().Это то же самое, что делать это:

int* getInt()
{
    int a = 10;
    return &a;
}

int* a = getInt();


int v = *a ; // v may be 10 or may be not 

Вы можете спросить, почему работает первый код?Он работает просто по счастливой случайности: так получилось, что для этого кода компилятор генерирует код, который не использует стековую память, которая использовалась итератором.Во втором примере компилятор может генерировать другой код, в котором использовалась и изменялась память итератора.

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