在执行语句new called
时打印输出Test *m = new Test();
。但是我们没有将任何参数传递给用户定义的new
函数。
有人可以解释这里发生了什么吗?
#include<stdlib.h>
#include<iostream>
using namespace std;
class Test {
public:
void* operator new(size_t size);
void operator delete(void*);
Test() { cout<<"\n Constructor called"; }
~Test() { cout<<"\n Destructor called"; }
};
void* Test::operator new(size_t size)
{
cout<<"\n new called";
void *storage = malloc(size);
return storage;
}
void Test::operator delete(void *p )
{
cout<<"\n delete called";
free(p);
}
int main()
{
Test *m = new Test();
delete m;
return 0;
}
答案 0 :(得分:0)
这也是Kerrick在size_t parameter new operator
中所涉及的内容隐含地调用Test::new(sizeof(Test))
来获取关键字new的内存以提供给构造函数使用。
所以当你没有意识到它时,你实际上是在呼唤它。您可以使用调试器和堆栈跟踪来解决这个问题,或者使用有关覆盖新运算符以及构造函数如何工作的文档。
Operator New和New Keyword之间的关系
不要因为有一个新关键字和一个新关键字而感到困惑 操作员新。当你写:MyClass * x = new MyClass;有 实际上发生了两件事 - 内存分配和对象 施工; new关键字对两者都负责。迈出了一步 进程是为了分配内存而调用operator new;另一个 步骤是实际调用构造函数。新的操作员让你 更改内存分配方法,但没有任何内容 调用构造函数的责任。这是新的工作 关键字。