在没有提供参数的情况下,如何调用我的重载new

How is my overloaded new getting called when no argument is provided?

本文关键字:何调用 调用 new 重载 我的 参数 情况下      更新时间:2023-10-16

在输出中,执行语句Test *m = new Test();时打印new called。但是,我们并没有将任何参数传递给用户定义的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;
}

这也是Kerrick在size_t参数新运算符中所做的大致内容

隐含地,有一个对Test::new(sizeof(Test))的调用来获得关键字new的内存,以提供给构造函数使用。

因此,当你没有意识到它时,你实际上是在调用它。你可以使用调试器和堆栈跟踪来解决这个问题,或者使用有关重写新运算符和构造函数如何工作的文档。

Operator New与新关键字的关系

不要被同时存在新关键字和操作员新。当你写:MyClass*x=新的MyClass;有实际上发生了两件事——内存分配和对象建设新关键字对这两者都负责。过程是调用操作员new以便分配内存;另一个步骤是实际调用构造函数。Operator new让您更改内存分配方法,但没有负责调用构造函数。这是新人的工作关键字。

http://www.cprogramming.com/tutorial/operator_new.html