Оператор перегрузки new(), почему конструктор вызывается дважды?
Я не могу понять некоторые проблемы при изучении новой / удалить перегрузку. Вопросы:
- Почему new вызывается перед деструктором конструктора перед удалением?
- Почему конструктор вызывается дважды при использовании::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);
}
И вы увидите, что класс создается только один раз.