我有这样的代码:
struct sWindowInfo {
WNDPROC pPrevWndProc;
};
typedef std::list<sWindowInfo> windowsList;
和function,它返回指向列表中第一个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);
发生运行时错误,我在调试器中看到奇怪的值。 我不明白,为什么?在我看来,这是相同的代码。
答案 0 :(得分:1)
两种实现都是错误的。您不应该返回指向迭代器的指针,因为它在windowGet()调用后将无效。 这与做到这一点是一样的:
int* getInt()
{
int a = 10;
return &a;
}
int* a = getInt();
int v = *a ; // v may be 10 or may be not
您可能会问为什么第一个代码有效?它正好运气:它发生了,因为代码编译器生成的代码不使用迭代器使用的堆栈内存。在第二个示例中,编译器可以生成使用和更改迭代器内存的不同代码。