3

對於delete應用於指向未完成類型的指針的情況,Visual C++有C4150 warning刪除不完整的類型是不是C++中的錯誤時是否存在真實生活案例?

根據標準,此類情況會產生未定義的行爲。在Visual C++中的AFAIK,它們導致默認的operator delete()函數,並且沒有調用析構函數,它允許有許多錯誤。

現在我可以在Visual C++中使用#prarma warning(error : 4150)來將該警告視爲錯誤。我想這是爲什麼它是一個警告,而不是默認情況下在Visual C++中的錯誤的原因。

在哪些現實生活中,我想允許這種情況?爲什麼我不會將該警告切換爲編譯器錯誤?

+0

'void'算作不完整類型嗎?如果是,[this](http://stackoverflow.com/questions/6172232/is-it-undefined-behaviour-to-delete-a-null-void-pointer)可能是相關的。 :) – Xeo

+0

你永遠無法知道微軟對他們的產品意味着什麼。 – Dani

+0

也許是一個瑣碎的析構函數? –

回答

5

它並不總是一個UB。

如果被刪除的對象在刪除點具有不完整的類類型,並且完整的類具有非平凡的析構函數或釋放函數,則行爲是未定義的。

+0

Ahem正是我的感覺(評論)!一個具有微不足道的析構函數的類不應該導致UB。 –

2

如果指針是0(或C++ 11中的nullptr),那麼該怎麼辦?根據定義,delete 0;是無操作的。

+0

'0'是否算作不完整類型? –

+0

@Als:不,但是'struct s; s * p = 0;刪除p;'確實。我只是想強調它和'delete 0;'是一樣的。 – Xeo

+0

啊好吧..Ofcourse,這是臨界情況下,類型是一個不完全不透明指針,但它指向'0',所以'刪除'它是一個無操作。 –

相關問題