2016-03-07 55 views
2

我是新來的c + +,並試圖運營商重載新和刪除關鍵字的程序。在探索類特定的重載示例時,我發現了下面的程序。爲什麼它不會在無限循環

#include <iostream> 
// class-specific allocation functions 
struct X { 
    static void* operator new(std::size_t sz) 
    { 
     std::cout << "custom new for size " << sz << '\n'; 
     return ::operator new(sz); 
    } 
    static void* operator new[](std::size_t sz) 
    { 
     std::cout << "custom new for size " << sz << '\n'; 
     return ::operator new(sz); 
    } 
}; 
int main() { 
    X* p1 = new X; 
    delete p1; 
    X* p2 = new X[10]; 
    delete[] p2; 
} 

令人驚訝的是,上述程序正在運行。由於我們正在爲新的和刪除關鍵字編寫自己的代碼,同時我們也在使用它。我的想法應該是無限循環。但它工作正常。 請在下面找到結果。

custom new for size 1 
custom new for size 10 

請有人請在此建議。

+4

你不用':: operator new(sz);'......來調用你自己的操作符new ...參見:http://stackoverflow.com/questions/4269034/what-is-the-meaning-of-prepended -double-colon – gurka

+10

我不禁想知道爲什麼,如果你對這門語言很陌生,你想從一開始就玩大多數C++程序員在他們的生活中從未碰過的功能...... –

+1

恭喜你扭轉了無限的通常形式循環問題,這是「爲什麼我的代碼永遠不會退出循環?」 –

回答

2

你的程序沒有進入無限循環,因爲你正在使用範圍分辨率return你的超載new運算符的含義你沒有在這裏調用你自己的new

爲了使它進入無限循環改變它

return operator new(sz); 

我希望這有助於。