2010-12-11 66 views
1

例如,文章通常會說,如果malloc和delete配對,或者說它是錯誤的並且不這樣做。爲什麼不編譯導致未定義行爲的代碼錯誤

但爲什麼編譯器不檢查我們。

是否有任何情況下這種代碼是正確的和有意的?因此,編譯器不能總是說它做錯了嗎?

或者編譯器是否存在技術上的困難?

回答

2

很多原因。離開我的頭頂。

  • 某些未定義的行爲可能會將已定義的效果定義爲實現特定的擴展。

  • 一些未定義的行爲僅基於程序的環境或輸入發生,因此代碼可能會導致未定義的行爲,但不一定會這樣做。

  • 許多未定義行爲的實例很難診斷。可能涉及可能在後續翻譯單元中發生衝突的事情。如果他們很容易診斷,那麼標準可能需要實施來發布診斷,就像在許多情況下一樣。

0

編譯器不一定知道指針是否使用new,malloc創建,或者它只是指向堆棧上的某個指針。但是,內存調試器(如valgrind)可以找到這些錯誤中的一部分。

1

那麼,你會怎麼說呢?

int* p = (int*)malloc(sizeof(p)); 
foobar(&p); 
delete p; 

foobar是在不同的編譯單元中。你不知道它做了什麼。

1

在某些情況下,實際上理論上不可能確定malloc是否與刪除配對。試想一下halting problem和程序結束時的刪除。

相關問題