Spo*_*rth 1 c++ vector std undefined-behavior
如果我发生什么clear一个vector这是已经清除之前?我在Visual Studio中尝试过,它没有导致任何运行时错误.但我正在寻找一个可能的例外原因(下图)并想知道这是否是原因?
*** glibc detected *** process.out: double free or corruption (out): 0x01a0b588 ***
Run Code Online (Sandbox Code Playgroud)
更新代码:
bool myclass::Sort(SortType enSortOption)
{
bool bRet = TRUE;
m_oVecOfIntsOrig.clear();
m_oVecOfIntsSorted.clear();
for(int i = 0;i<m_oList.listsize();i++)
{
m_oVecOfIntsOrig.push_back(i);
}
m_oVecOfIntsSorted = m_oVecOfIntsOrig;
//Just sort the indices
switch(enSortOption)
{
case Alpha:
{
t_SortStructAlpha sSortAlpha(this);
sort( m_oVecOfIntsSorted.begin(), m_oVecOfIntsSorted.end(), sSortAlpha );
}
break;
case Dist:
{
t_SortStructDist sSortDist(this);
sort( m_oVecOfIntsSorted.begin(), m_oVecOfIntsSorted.end(), sSortDist );
}
break;
case none:
{
//Nothing to do
return TRUE;
}
break;
default:
{
bRet = FALSE;
}
break;
}
//Update the list based on sorted index vector
ListElem oSortedListElements;
//this clear function simply clears all the 7 constituent vectors.
oSortedListElements.vClear();
if(TRUE == bGetSortedList(oSortedListElements))
{
//If successfully copied to temp object, then update member variable
//m_oList is what I'm intending to display
m_oList.vClear();
m_oList = oSortedListElements;
}
else
{
//copy failed
bRet = FALSE;
}
return bRet;
}
bool myclass::bGetSortedList(ListElem& oSortedListElements)
{
bool bRet = TRUE;
//Creating object from beginning, so clear old contents if any
oSortedListElements.vClear();
/* Sort done. Now update the list based on new indices*/
for(int u16Index = 0; u16Index<m_oVecOfIntsSorted.size(); u16Index++)
{
if(
(m_oVecOfIntsSorted.at(u16Index) >= m_oListConstituents.oVec1.size())
||
(m_oVecOfIntsSorted.at(u16Index) >= m_oListConstituents.oVec2.size())
||
(m_oVecOfIntsSorted.at(u16Index) >= m_oListConstituents.oVec3.size())
||
(m_oVecOfIntsSorted.at(u16Index) >= m_oListConstituents.oVec4.size())
||
(m_oVecOfIntsSorted.at(u16Index) >= m_oListConstituents.oVec5.size())
||
(m_oVecOfIntsSorted.at(u16Index) >= m_oListConstituents.oVec6.size())
||
(m_oVecOfIntsSorted.at(u16Index) >= m_oListConstituents.oVec7.size())
)
{
//out of bounds check
return FALSE;
}
//m_oListConstituents contains overall list
oSortedListElements.oVec1.push_back(m_oListConstituents.oVec1.at(m_oVecOfIntsSorted.at(u16Index)));
oSortedListElements.oVec2.push_back(m_oListConstituents.oVec2.at(m_oVecOfIntsSorted.at(u16Index)));
oSortedListElements.oVec3.push_back(m_oListConstituents.oVec3.at(m_oVecOfIntsSorted.at(u16Index)));
oSortedListElements.oVec4.push_back(m_oListConstituents.oVec4.at(m_oVecOfIntsSorted.at(u16Index)));
oSortedListElements.oVec5.push_back(m_oListConstituents.oVec5.at(m_oVecOfIntsSorted.at(u16Index)));
oSortedListElements.oVec6.push_back(m_oListConstituents.oVec6.at(m_oVecOfIntsSorted.at(u16Index)));
oSortedListElements.oVec7.push_back(m_oListConstituents.oVec7.at(m_oVecOfIntsSorted.at(u16Index)));
}
return bRet;
}
Run Code Online (Sandbox Code Playgroud)
如果你做了什么相当于
v.clear();
v.clear();
Run Code Online (Sandbox Code Playgroud)
然后不,没有UB:其中一个后置条件v.clear()是v.size() == 0,所以第二次调用clear应该是无操作.
| 归档时间: |
|
| 查看次数: |
5123 次 |
| 最近记录: |