Оператор перегрузки new(), почему конструктор вызывается дважды?

Я не могу понять некоторые проблемы при изучении новой / удалить перегрузку. Вопросы:

  1. Почему new вызывается перед деструктором конструктора перед удалением?
  2. Почему конструктор вызывается дважды при использовании::new?

Я добавил код здесь:


#include<iostream>

using namespace std;

class MyClass
{
public:
    MyClass() { 
        cout << "My Class is Constructed !" << endl; 

    }

    ~MyClass() { cout << "My Class is Deleted ! " << endl; }

     static void *operator new(size_t Size)
    {
        cout << "new call" << endl;
        MyClass *p = ::new MyClass;
        return p;
     }
     static void operator delete(void *p)
     {
         cout << "delete call" << endl;
         ::delete p;
     }

};
int main()
{
    MyClass  *p = new MyClass;
    delete p;
    cin.get();
    return 0;
}

output:
new call
My Class is Constructed !
My Class is Constructed !
My Class is Deleted !
delete call

1 ответ

Причина, по которой это происходит, заключается в том, что когда вы newРаспределение и строительство происходит в два этапа. Первый - это фактическое распределение, а второй - строительство через размещение новых.

Предоставленная вами перегрузка предназначена только для выделения памяти (отсюда size_t параметр), но вместо этого вы позвонили new на классе, который будет делать оба шага сверху. Вы должны только выделить память в этой функции. Так что измените свою функцию, чтобы быть

static void *operator new(size_t size)
{
   return ::operator new(size);
}

И вы увидите, что класс создается только один раз.

Другие вопросы по тегам