例如,文章通常會說,如果malloc和delete配對,或者說它是錯誤的並且不這樣做。爲什麼不編譯導致未定義行爲的代碼錯誤
但爲什麼編譯器不檢查我們。
是否有任何情況下這種代碼是正確的和有意的?因此,編譯器不能總是說它做錯了嗎?
或者編譯器是否存在技術上的困難?
例如,文章通常會說,如果malloc和delete配對,或者說它是錯誤的並且不這樣做。爲什麼不編譯導致未定義行爲的代碼錯誤
但爲什麼編譯器不檢查我們。
是否有任何情況下這種代碼是正確的和有意的?因此,編譯器不能總是說它做錯了嗎?
或者編譯器是否存在技術上的困難?
很多原因。離開我的頭頂。
某些未定義的行爲可能會將已定義的效果定義爲實現特定的擴展。
一些未定義的行爲僅基於程序的環境或輸入發生,因此代碼可能會導致未定義的行爲,但不一定會這樣做。
許多未定義行爲的實例很難診斷。可能涉及可能在後續翻譯單元中發生衝突的事情。如果他們很容易診斷,那麼標準可能需要實施來發布診斷,就像在許多情況下一樣。
編譯器不一定知道指針是否使用new
,malloc
創建,或者它只是指向堆棧上的某個指針。但是,內存調試器(如valgrind)可以找到這些錯誤中的一部分。
那麼,你會怎麼說呢?
int* p = (int*)malloc(sizeof(p));
foobar(&p);
delete p;
foobar
是在不同的編譯單元中。你不知道它做了什麼。
在某些情況下,實際上理論上不可能確定malloc是否與刪除配對。試想一下halting problem和程序結束時的刪除。