[英]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.