2011-07-31 71 views
-1

對不起,如果這聽起來像一個「它編譯,所以它必須工作!」問題,但我想了解爲什麼會發生某些事情(或者根本不會發生)。MSVC++說圍繞一個變量的堆棧被損壞,但程序工作

在項目設置中,我將Basic Runtime Checks設置爲Both。調試器通知我:

運行時檢查失敗#2 - 變量'beg'周圍的堆棧已損壞。

但是,如果我將它設置爲默認值,即none,程序將運行並正常完成,不會引發異常並且不會導致錯誤。

我的問題是,我可以放心地忽略這個(因爲MSVC++可能有點不對),或者這是一個真正的問題嗎?我看不到程序如何在堆棧被擰緊時成功繼續。


編輯:

導致此錯誤的功能看起來完全是這樣的:

int fun(list<int>::iterator&, const list<int>::iterator&); 

int foo(list<int>& l) { 
    list<int>::iterator beg = l.begin(); 
    list<int>::iterator end = l.end(); 
    return fun(beg, end); 
} 

fun增量和beg運行,當它返回,beg == end,當MSVC++符,它指向到收盤價}


編輯2:

我已經分離的問題。在某些情況下,fun會從list中刪除擁有所迭代項目的一些元素。這是導致錯誤的原因。

+0

@SethCarnegie讓我們[在聊天中繼續討論](http://chat.stackoverflow.com/rooms/1994/discussion-between-merlyn-morgan-graham-and-seth-carnegie) –

回答

4

如果沒有代碼來重現問題,則無法回答您的問題。

但是給你的一般問題一個模糊的答案 - 如果編譯器或調試器檢測到問題,你可能有一個問題。

在C++中,僅僅因爲「出錯」並不意味着程序會崩潰 - 它可能會以完全不可預知的結果繼續運行。它甚至可以完成你想要的結果。但僅僅因爲它在你的系統上運行良好,並不能保證其他系統,編譯器,一天中的時間,甚至是同一個程序的額外運行。

這被稱爲undefined behavior,是由錯誤地使用該語言引起的(但不是以導致編譯失敗的方式)。緩衝區溢出只是幾十個例子中的一個。

+0

看看額外的在我的編輯信息有所幫助 - 如果沒有,說出來,我會盡量提供更多。 –

+0

再次編輯了更多信息。 –

+0

@Seth:要做的事情是添加一小部分演示問題的代碼(可能不是真正的代碼),然後爲自己的問題添加一個答案,以顯示* why *導致問題。我的回答並沒有真正回答你的具體問題...... –

1

事實證明,我的Visual Studio安裝出現問題,因此重新安裝它可以解決問題。