学习新/删除重载时,我无法理解一些问题。 问题:
我在这里添加了代码:
#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
答案 0 :(得分:4)
之所以发生这种情况,是因为当您使用new
分配内容时,分配和构建分两个阶段进行。第一个是实际分配,第二个是通过新建的分配。
您提供的重载只是用于分配内存(因此是size_t
参数),而是在类上调用new
,它将从上面执行两个步骤。您应该只在该函数中分配内存。所以将你的功能改为
static void *operator new(size_t size)
{
return ::operator new(size);
}
你会看到这个类只被构造一次。