2011-07-20 43 views
0

我有這樣的代碼:獲得的C++列表迭代問題價值

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

和功能,它返回指向第一個窗口,信息結構的迭代器列表:

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); 

運行時錯誤發生,我在調試器中看到奇怪的值。 我不明白,爲什麼?在我看來,這是相同的代碼。

+3

你爲什麼使用指向迭代器的指針? – bitmask

+2

顯示'windowGet()'的實現;你可能會返回一個臨時/本地對象的地址。 – ildjarn

+0

爲什麼不能列表本身? – Ajay

回答

1

這兩種實現都是錯誤的。你不應該返回指向迭代器的指針,因爲它將在windowGet()調用後無效。 這是同樣的事情,這樣做:

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

int* a = getInt(); 


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

你可能會問,爲什麼第一個代碼工作?它運行得很順利:它發生的事情是,代碼編譯器生成的代碼不使用迭代器使用的堆棧內存。在第二個示例中,編譯器可能會生成一個不同的代碼,其中使用和更改了迭代器內存。

+0

我的不好,謝謝..我可以返回迭代器本身嗎?或者這是不好的做法?按值返回迭代器的 – valex

+0

很好。 – Sasha

+0

@valex:按值返回迭代器是_idiomatic_。事實上,每個標準庫算法都是通過值獲取迭代器。 – ildjarn