当没有提供参数时,如何调用我的重载新函数?

时间:2013-08-29 18:04:13

标签: c++ pointers operator-overloading new-operator

在执行语句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;
}

1 个答案:

答案 0 :(得分:0)

这也是Kerrick在size_t parameter new operator

中所涉及的内容

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

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

  

Operator New和New Keyword之间的关系

     

不要因为有一个新关键字和一个新关键字而感到困惑   操作员新。当你写:MyClass * x = new MyClass;有   实际上发生了两件事 - 内存分配和对象   施工; new关键字对两者都负责。迈出了一步   进程是为了分配内存而调用operator new;另一个   步骤是实际调用构造函数。新的操作员让你   更改内存分配方法,但没有任何内容   调用构造函数的责任。这是新的工作   关键字。

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