在閱讀this question的答案時,我注意到答案(例如this)意味着即使delete
語句在空指針上執行時也可以調用operator delete
。爲什麼當我在空指針上調用「delete」時調用「operator delete」?
所以我寫了一個小片段:
class Test {
public:
void* operator new(size_t) { /*doesn't matter*/ return 0; }
void operator delete(void* ptr) {
ptr; //to suppress warning and have a line to put breakpoint on
}
};
int main()
{
Test* ptr = 0;
delete ptr;
}
和 - 令人驚訝的我 - Test::operator delete()
被調用,ptr
拿着一個空指針。
據我所知operator new
分配內存和operator delete
返回分配器的內存。如果我在空指針上調用delete
語句,則意味着指針後面沒有對象,並且沒有內存返回到分配器。
delete
語句包括調用析構函數。當我傳遞一個空指針時,析構函數肯定不會被調用 - C++負責處理這個問題。那麼爲什麼在這種情況下調用operator delete
?
問一下爲什麼當你分配零長度數組時,調用operator new:'new Test [0];'...;) – ybungalobill 2010-09-29 13:37:44
@ybungalobill:這很簡單 - 標準要求返回的指針是有效的且不同的。 – sharptooth 2010-09-29 14:08:10
請注意,如果您使析構函數爲虛擬,則不會調用重載'operator delete'。實現通常直接從析構函數調用該函數,並在不檢查null的情況下調用析構函數(從而節省一些指令)。只有當呼叫需要虛擬調度時纔是預先執行的檢查。 – avakar 2010-09-29 14:11:10