我正在使用虚拟点亮控件,我从地图中获取数据。我的问题是当我运行代码时,它显示列表ok,但是当鼠标光标移动到列表控件或我尝试向下滚动时,它会给出一个Debug Assertion失败,说map / set iterator不是dereferencable。我的GetDispInfo()方法如下:
void CListCtrlTestDlg::GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem = &(pDispInfo)->item;
map<int, Error_Struct>::iterator it = Error_Map.find((pItem->iItem) + 1);
int iErrCode = (*it).second.i_ErrorCode;
CString cError = (*it).second.c_Error;
switch(pItem->iSubItem)
{
case 0:
sprintf_s(pItem->pszText, 10, "[ %d ]", iErrCode);
break;
case 1:
sprintf_s(pItem->pszText, 100, "%s", cError);
break;
}
*pResult = 0;
}
此外,如果当鼠标指针位于列表控件的顶部时,程序再次崩溃,表示下面的输出违规在output.c文件中显示:
#else /* _UNICODE */
if (_putc_nolock(ch, f) == EOF)
有没有人有同样的经历?我在这里做错了什么,如何解决这个问题?
谢谢!
答案 0 :(得分:1)
对于初学者,你怎么知道你传递给sprintf_s的你的魔法常数10和100实际上是pItem-> pszText中正确的空间量?你应该使用pItem-&gt; cchText。
其次,您应该检查从std :: map :: find返回的迭代器是否有效。
答案 1 :(得分:0)
实际问题是我正在尝试将数据复制到LV_ITEM结构的非缓冲区成员。我试图将数据复制到一个指针,这就是问题所在。我真正应该做的是为该指针赋值而不复制数据。
p = o_RBTree.FindByPosition((pItem->iItem) + 1);
char zKey[10];
zKey[0] = '\0';
sprintf_s(zKey, 10, "%d", p.first);
char zVal[100];
zVal[0] = '\0';
sprintf_s(zVal, 100, "%d", p.second);
if (pItem->mask && LVIF_TEXT)
{
switch(pItem->iSubItem)
{
case 0:
pItem->pszText = zKey;
break;
case 1:
pItem->pszText = zVal;
break;
}
}
这完美无缺!谢谢你的帮助。