私は問題を見つけたばかりだと思いますが (そうではないかもしれません)、その理由を理解したいと思います。以下はコードのスナップショットです。できるだけシンプルにしようとしました。
class FOO
{
public:
int m_iNum; //sort according to this.
std::vector<unsigned char>::iterator m_itContents;
//filling this contributes to issue with sorting in debug only?
//m_Contents does not come into other sections below at all.
unsigned char *m_Contents; //using this instead,
//no asserts or crash in debug.
};
class MyFile
{
public:
std::vector<FOO> vFoo1; //this gets filled with file data.
};
std::vector<FOO> vFooVirtualList; //class member
int iColumnSel = -1;
int iSortResult1 = 1;
int iSortResult2 = -1;
int iVirtualListCount = 0;
void FillList()
{
std::vector<Foo>::iterator itFoo;
itFoo = MyFile->Foo1.begin() ;
iVirtualListCount = 0;
vFooVirtualList.clear();
std::vector<Foo> vTemp;
vTemp.swap( vFooVirtualList );
vFooVirtualList.reserve(FileCount); // int filecount
for(int i=0;i< FileCount ;i++ ,itFoo++)
{
vFooVirtualList.push_back(*itFoo);
iVirtualListCount++;
}
// Tell the list box to update itself.
m_List.SetItemCountEx(iVirtualListCount);
//m_List is CListCtrl, used as virtual list.
m_List.Invalidate();
}
void OnLvnGetdispinfoMainframelist(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
LV_ITEM* pItem= &(pDispInfo)->item;
std::vector<FOO>::iterator itFooList;
itFooList = vFooVirtualList.begin() + pItem->iItem;
CString str;
if(pItem->mask & LVIF_TEXT)
{
// then display the appropriate column
switch(pItem->iSubItem)
{
case 0:
str.Format(L"%d",itFooList->m_iNum);
lstrcpy(pItem->pszText, str);
break;
default:
break;
}
}
*pResult = 1;
}
//sort by column
void OnLvnColumnclickMainframelist(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
for(iColumnSel = 0; iColumnSel < 1; iColumnSel++)
{
if(iColumnSel == pNMLV->iSubItem)
SortByCol(iColumnSel);
}
// Redraw the list.
m_List.Invalidate();
*pResult = 0;
}
//sorting done based only on Num.
int __cdecl CompareByFileNum(const void *elem1, const void *elem2)
{
int result = 0;
FOO *Item1 = (FOO*)elem1;
FOO *Item2 = (FOO*)elem2;
switch(iColumnSel)
{
case 0:
if(Item1->m_iNum < Item2->m_iNum)
result = iSortResult1;
if(Item1->m_iNum > Item2->im_Num)
result = iSortResult2;
return result;
break;
default:
break;
}
return 1;
}
void SortByCol(const int ColIndex)
{
//fill list. sort. then load another file = crash. Only in debug mode?
//if list is in proper order, no problem on new file load. otherwise crash.
qsort( static_cast<void*>(&vFOOVirtualList[0]), iVirtualListCount, sizeof(FOO), CompareByFileNum);
iSortResult1 = (iSortResult1*-1);
iSortResult2 = (iSortResult2*-1);
}
イテレータで何か特別なことをする必要があるのだろうか?
FillList()
仮想リストが最初と同じ順序ではない場合、2回目の呼び出し(つまり、新しいファイル)を除いて、ここでは正常に動作し、新しいファイルでクラッシュしますが、デバッグモードでのみ、ポインタではなくイテレータを使用する場合のみです。" iterator list corrupted or Unhandled exception at 0x0042c509
" (わずかに変更) を取得し、181 行目または 177 行目のいずれの場合も xutility を参照します。