我發現了一段代碼,它有UB,並被告知將它留在代碼中,並且有一條評論指出它是UB。僅使用MSVC2012。未定義的行爲是否存在有效的「用例」?
代碼本身具有Foo
對象的原始陣列,然後投射該數組char*
與reinterpret_cast<char*>
,然後在其上調用delete casted_array
(這樣,不刪除[])。
像這樣:
Foo* foos = new Foo[500];
char* CastedFoos = reinterpret_cast<char*>(foos);
delete CastedFoos;
按標準5.3.5/3這顯然是未定義的行爲。
很明顯,這段代碼做的是避免必須調用析構函數作爲優化。
我想知道,有沒有實際的地方在代碼離開UB可以考慮有效?
另外,就我而言,在代碼中留下上述內容並不聰明,對嗎?
技術上,UB是UB。一個特定的實現可能會演示UB類型的特定循環行爲,但這不會保證行爲不可移植。 – 2013-05-01 12:57:00
幾乎所有實現特定的擴展在標準C++中都是未定義的行爲,並且使用擴展肯定有合法的原因。 – hvd 2013-05-01 12:57:38
沒關係這個問題,但爲什麼這是必要的?如果'Foo'沒有任何有用的破壞,就給它一個微不足道的析構函數。如果它確實存在,並且你接受了泄漏,那麼爲什麼還要放開記憶呢? – 2013-05-01 13:07:09