重载运算符 new(),为什么构造函数被调用两次?

overload operator new(), why constructor is called twice?

本文关键字:调用 两次 为什么 运算符 new 重载 构造函数      更新时间:2023-10-16

我在学习new/delete重载时无法理解一些问题。 问题:

  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

发生这种情况的原因是,当您使用new分配某些东西时,分配和构造分两个阶段发生。 第一个是实际分配,第二个是通过放置新建筑。

您提供的重载仅用于分配内存(因此是size_t参数(,而是在类上调用了new,该类将从上面执行这两个步骤。 您应该只分配该函数中的内存。 所以把你的函数改成

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

你会看到这个类只被构造一次。