0

In the output new called is printed when the statement Test *m = new Test(); is executed. But we are not passing any argument to the user-defined new function.

Can someone explain what's going on here?

#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;
}
4

1 回答 1

0

这也大致是 Kerrick 在size_t 参数 new 运算符中所经历的

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

因此,虽然您没有意识到它,但实际上您正在调用它。您可以使用调试器和堆栈跟踪来解决这个问题,或者使用有关覆盖 new 运算符以及构造函数如何工作的文档。

算子new和new关键字的关系

不要对同时存在 new 关键字和运算符 new 的事实感到困惑。当你写: MyClass *x = new MyClass; 实际上发生了两件事——内存分配和对象构造;new 关键字对两者都负责。该过程的一个步骤是调用 operator new 以分配内存;另一个步骤是实际调用构造函数。运算符 new 允许您更改内存分配方法,但不负责调用构造函数。这就是 new 关键字的作用。

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

于 2013-08-29T18:10:37.797 回答