2016-10-07 3 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. Помните, что t->print(); такое же, как print(t);, ваша функция подписи на самом деле:

void print(Test* 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: undefined. Ваш результат является проявлением этого неопределенного поведения.

Это просто происходит в вашем конкретном случае (возможно, потому, что ваш класс - всего лишь мешок функций).

(В наши дни это хорошая идея использовать nullptr, а не старомодно и не совсем правильное NULL.)

+0

Это скорее лучший ответ, чем принятый, который полон неправильных фактов и плохих советов. –

+0

@MikeVine Я не вижу никаких «советов» в своем ответе. Если вы не согласны с чем-либо в ответе, оставьте комментарий. –

+1

@GillBates _... Ваша подпись функций на самом деле ... Нет, это не так. _Если вы хотите увидеть, что все крушит и сжигает. Нет, они не будут. Undefined Behavoir не определено. Либо оригинал, либо ваш новый может или не может произойти сбой в зависимости от многих разных вещей, включая, возможно, фазу луны. Его _Undefined_. Этот ответ говорит об этом. Не определено это просто. Практически никогда не получается разобраться, почему что-то происходит после UB. –