2012-05-21 58 views
0

由於有些日子,我一直在Visual Studio 2008中遇到與我的C++軟件相關的問題。 如果我將Visual Studio設置設置爲「發佈Win32」模式,它工作正常。C++ Visual Studio 2008,delete()操作崩潰程序

但是,如果我將它設置爲「調試Win32」,它使用刪除時有崩潰問題。編譯是正常的,但是,運行時,軟件會在第一次「刪除」時遇到崩潰。

考慮這個snaphsot:

enter image description here

正如你可以看到,當軟件到達 「刪除臨時」;命令執行,它崩潰顯示消息:

調試斷言失敗! 計劃... 表達_BLOCK_TYPE_IS_VALID(pHead-> nBlockHouse)

問題是什麼? 如何解決它?

爲什麼在「發佈」模式下它沒有任何錯誤?

Thanx

+4

你可以發佈代碼而不是屏幕截圖嗎? – hmjd

+0

在發行版中,默認情況下編譯器不會執行斷言。這就是編譯沒有錯誤的原因 – v01d

+0

'temp'是'NULL'。用'NULL'做任何事情都是不好的,可以假設的visual studio在調試模式下有某種斷言,它在發佈模式下被禁用。那麼你是不幸的,它不會崩潰,似乎工作。 – BoBTFish

回答

4

您應該只有deletenewdelete[]new[]什麼。沒有其他的。你也試圖使用空指針來調用一個函數。當你試圖調用一種沒有用的方法時會發生什麼?那麼,它不會是什麼好事。

+0

你是對的,有一些「新」缺失。謝謝! –

+1

@ DavideChicco.it,記住通常最好在堆棧上分配一些東西,而不是使用'new'。它更短,你不必清理。如果你確實需要'new',你應該看看智能指針,因爲它們爲你管理內存。 – chris

+0

@ DavideChicco.it:在現代C++中,經驗法則是:_「如果你正在調用'new',你可能做錯了什麼」_。正如已經寫過的,嘗試在堆棧上分配或者至少使用智能指針和諸如'make_unique','make_shared'等東西。 – 2012-05-21 14:15:06

3

你有temp = NULL,並在下一行你調用一個方法嗎?然後你嘗試刪除它嗎?


除此之外,斷言不是「錯誤」。在調試模式下,斷言聲明您斷言了某些條件(這些條件通常也包含在MFC等庫中),並且如果斷言失敗,它會調用代碼來通知您,並讓您有機會打入調試器以調試問題。

+2

'刪除NULL'完全沒問題。這是一個無操作。在NULL對象上調用成員函數當然會調用UB--我認爲這是問題所在。 – dirkgently

+0

@izomorphius不是這樣。如果我刪除它,它會在下一次刪除時崩潰... fstream uscita; uscita.open(「valori.txt」,ios :: out); uscita.close();刪除uscita; >>>它崩潰 –

+1

@ DavidChicco.it:你不能'刪除'一個自動對象。這又是UB。您只能(安全地)調用(有效)指針上的刪除。 – dirkgently

0

調試器執行「斷言」。這是對代碼正確性的額外檢查,例如:「聲明指針不爲空」。這樣做很好,因爲它有助於發現錯誤。我同意任何聲稱調試器發出的消息無助於找出錯誤來源的人。