c++ - 获取C++列表迭代器问题的值(value)

标签 c++ visual-studio-2010 list iterator

我有这样的代码:

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

发生运行时错误,我在调试器中看到奇怪的值。 我不明白,为什么?在我看来,这是相同的代码。

最佳答案

两种实现都是错误的。您不应返回指向迭代器的指针,因为它在 windowGet() 调用后将无效。 这与这样做是一样的:

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

int* a = getInt();


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

您可能会问为什么第一个代码有效?它的工作完全靠运气:碰巧对于该代码,编译器生成的代码没有使用迭代器使用的堆栈内存。在第二个示例中,编译器可能会生成不同的代码,其中使用和更改了迭代器内存。

关于c++ - 获取C++列表迭代器问题的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6755761/

相关文章:

c++ - ARM Cortex M 处理器的 GNU 科学库编译错误

c++ - Boost::beast:多个 async_write 调用触发了断言错误

c++ - 我在使用 cuSolver 的设备上找不到 LU 分解

c++ - C2864 编译器错误

C++ VS2010 不使用我的调试命令行参数

c - 在 C 编程中,我们如何初始化这个 int *goo,其中 goo 是图的边列表?

java - 判断链表是否是回文

java - 改进计算余数的递归

c++ - 编译器何时可以将调用静态绑定(bind)到虚函数?

Python/Pandas - 给定特定日期,查找列表中的前一个日期