Приведет ли очистка уже пустого вектора к неопределенному поведению? - PullRequest
1 голос
/ 28 сентября 2011

Что произойдет, если я clear a vector, который уже был очищен ранее? Я попробовал это в Visual Studio, и это не привело к ошибкам во время выполнения. Но я ищу возможную причину исключения (ниже) И хотел бы знать, может ли это быть причиной?

*** glibc detected *** process.out: double free or corruption (out): 0x01a0b588 *** 

Обновление кода:

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;

}

Ответы [ 2 ]

6 голосов
/ 28 сентября 2011

Если то, что вы сделали, составляет

v.clear();
v.clear();

, то нет, нет UB: одно из постусловий v.clear() - это v.size() == 0, поэтому второй вызов clear должен бытьнет оп.

1 голос
/ 28 сентября 2011

Вызов метода clear дважды подряд должен подойти.Ваша ошибка выглядит так, как будто вы освобождаете то, что уже было освобождено.Это может произойти, потому что вы дважды вызвали free для одного и того же объекта или, возможно, поместили объект в свой вектор, который затем был удален.Вызов clear для вашего вектора вызовет эту ошибку (это проблема, потому что clear вызывает деструктор для любых объектов, содержащихся в векторе).

Редактировать:

at возвращает ссылку, поэтому удаление чего-либо, для которого установлено значение, возвращаемое at, может вызвать проблемы.

...