簡體   English   中英

C ++ std :: vector.insert在調試時崩潰,但在發行時有效

[英]c++ std::vector.insert crashes on debug but works on release

我的程序在此行崩潰,但僅在調試版本中崩潰,在發行版本中工作正常。

m_lstIds.insert(m_lstIds.begin() + indexInsert, ID);

'm_lstIds'是int的std :: vector,'ID'是int。 程序崩潰時,m_lstIds具有3個項(1、2、3)。 indexInsert為“ 0”,ID為“ 0”。

錯誤消息顯示:

Expression: vector iterator + offset out of range

我正在運行Visual Studio 2010; 我猜想這與不良的項目設置有關,后者與STL優化沖突。

編輯:當我說:“在發行時有效”是指如果我對i = 0..3執行std::cout<<m_lstIds[i] ,則實際上將得到0、1、2、3的輸出。 在調試版本中,當我嘗試插入時它只會崩潰。

Edit2:我找到了答案! 謝謝大家的幫助。

這是最短的復制。 問題是我在構造函數中調用的memset函數。 因為m_lstItem的構造m_lstItem是在memset之前調用的,它將刪除向量中允許insert正常工作的所有數據。

真正有趣的是它在發行版中如何工作,而在調試中卻沒有。 如果有人可以解釋那部分會很棒。

struct SimpleList
{
  SimpleList()
  {
    memset(this, 0, sizeof(SimpleList));
    m_lstItem.push_back(0);
    m_lstItem.push_back(1);
    m_lstItem.push_back(2);
  }

  void Crash()
  {
    m_lstItem.insert(m_lstItem.begin() + 0, 3);
  }

  std::vector<int>m_lstItem;
};

int main(int argc, char** argv[])
{ 
  SimpleList sl;
  sl.Crash();
  return 0;
}

memset(this, 0, sizeof(SimpleList)); 當您的結構不是POD時,這是不安全的。

由於成員std::vector<int>m_lstItem; ,您的結構不是POD。

因此,在這種情況下,使用memset不安全的 ,並導致不確定的行為 換句話說:任何事情都可以發生! 任何事情都包括按預期工作...

我的建議:除非您完全知道自己在做什么,否則不要在C ++中使用memset

我猜程序運行時indexInsert不為0。 當向量在調試模式下超出范圍時,向量將引發異常,而在釋放模式下則不會。 因此,向您展示完整的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM