1

我使用 MFC 虚拟列表控件来提高性能,并处理GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult)来填充 ListCtrl。该方法中的相关代码如下:

if (pItem->mask && LVIF_TEXT) {

    switch(pItem->iSubItem)

    {
        case 0:
            lstrcpy(pItem->pszText, rLabel.m_strText);  
        break;
        case 1:
            sprintf(pItem->pszText, "%d", p.o_Value);
        break;
        default:
            ASSERT(0);
        break;
    }
}

在这里,当我使用 lstrcpy() 时,当我向下/向上滚动时,我得到很多异常,说test_list_control.exe 中 0x7c80c741 的第一次机会异常:0xC0000005:访问冲突写入位置 0xb70bf2ac。这些消息出现在调试输出中。但程序不会崩溃。谁能解释一下这里的问题以及我应该如何克服它?

rLabel 是我之前声明的 CLabelItem。

谢谢!

4

2 回答 2

1

我认为您应该检查 pItem->pszText 指向的缓冲区是否足够大以容纳 rLabel.m_strText。或者,如果 rLabel.m_strText 是正确的以空字符结尾的字符串。对我来说,这看起来像是编写未初始化的内存。使用调试器检查这一点。

于 2010-07-08T08:12:54.733 回答
1

如果您所看到的只是第一次机会例外的事情,请不要担心。例如,请参阅http://blogs.msdn.com/b/davidklinems/archive/2005/07/12/438061.aspx,但您可以在各处找到类似的页面(主要是 5-10 年前的)。这意味着一些代码抛出,异常被捕获并处理。我有时会在 MFC 应用程序中看到这一点。正如博客条目所说

首次机会异常消息通常并不意味着代码中存在问题。

我会等到您看到实际错误后再开始处理这个错误。

于 2010-07-08T12:50:30.357 回答