2016-10-07 26 views
0

演算子のオーバーロードが新しく削除されるのを少し混乱させています。 私はいくつかのテストを書いた:C++ - オーバーロード演算子new

#include <iostream> 

using namespace std; 

class Test 
{ 
    public : 

    Test() 
    { 
     cout << "Test - ctor" <<endl; 
    } 

    ~Test() 
    { 
     cout << "Test - dtor" <<endl; 
    } 

    Test(const Test& t) 
    { 
     cout << "Test - copy ctor" <<endl; 
    } 

    Test& operator = (const Test& t) 
    { 
     cout << "Test - assiment operator" <<endl; 
    } 

    void* operator new(size_t size) 
    { 
     cout << "Test - operator new" <<endl; 
     return NULL; 
    } 

    void print() 
    { 
     cout << "print" << endl; 
    } 
}; 


int main() 
{ 
    Test* t = new Test(); 
    t->print(); 
    return 0; 
} 

、出力は次のとおりです。今

Test - operator new                                             
Test - ctor                                               
print 

私は「新しい」から「NULL」を返す場合、私は印刷に呼び出すときに、なぜ私のプログラムがクラッシュしません関数?ありがとう。

+0

が、それは定期的に未定義の動作です。 'Test * t = nullptr;を試してください。 t-> print(); 'と何が起こるかを見てください。 – molbdnilo

+0

UBはUBと同様です。 – George

答えて

2

print()は実際には何も必要ありません。クラスTestです。それは、stdoutにメッセージを出力することだけです。

void print(Test* t); 

しかし、それはすべてあなたのために、コンパイラによって行われています:t->print();print(t);と同じであることを忘れないでください、あなたの関数のシグネチャは実際にあります。

tこのメソッドでは使用されていないため、実行されているので運が良かったです。これはまだ未定義の動作です。

あなたは絶対に物事があなたのクラスビットを変更後、クラッシュし、やけどを見たい場合:

class Test 
{ 
    public : 

    Test() : x(0) 
    { 
     cout << "Test - ctor" <<endl; 
    } 

    ~Test() 
    { 
     cout << "Test - dtor" <<endl; 
    } 

    Test(const Test& t) 
    { 
     cout << "Test - copy ctor" <<endl; 
    } 

    Test& operator = (const Test& t) 
    { 
     cout << "Test - assiment operator" <<endl; 
    } 

    void* operator new(size_t size) 
    { 
     cout << "Test - operator new" <<endl; 
     return NULL; 
    } 

    void print() 
    { 
     cout << "print" << x << endl; 
    } 

private: 
    int x; 
}; 
+0

ありがとうございます。今私は理解している。 –

1

この特定の現象は、あなたのoperator new機能とは何の関係もありません。

NULLポインタを使用してメンバー関数を呼び出すときの動作は、未定義です。あなたの結果は、その未定義の振る舞いの現れです。

あなたの特定のケースでは(たぶんあなたのクラスが関数の単なるバッグなので)うまくいくようです。

は、(これらの日には、昔ながらのではなく絶対的に正しいNULLではなくnullptrを使用することをお勧めします。)、過負荷とは何の関係もありません

+0

これは間違った事実と悪いアドバイスでいっぱいです。 –

+0

@MikeVine私は私の答えに "アドバイス"が表示されません。あなたが答えの何かに同意しない場合は、コメントを残してください。 –

+1

@GillBates _...あなたの関数の署名は実際には... _いいえ、そうではありません。 _あなたが物事が墜落して燃えているのを見たいのであれば、彼らはいらない。未定義Behavoirは未定義です。おそらく月の位相を含む多くの異なる事柄によって、元のものか新しいものがクラッシュすることがあります。その_Undefined_。この答えはこれを言います。定義されていないのはそれだけです。 UBの後に何かが起こる理由を決めるのは決して正しいことではありません。 –

関連する問題