C++ 重载运算符新-错误输出

C++ 重载运算符新-错误输出,c++,operator-overloading,new-operator,operator-keyword,C++,Operator Overloading,New Operator,Operator Keyword,我正试图了解新/删除位置是如何工作的,因此我编写了以下程序: # include <iostream> # include <cstdlib> using namespace std; class Test {}; void * operator new (size_t size) throw (std::bad_alloc){ cout<<"Calling New:"<<endl; return new (malloc(size

我正试图了解新/删除位置是如何工作的,因此我编写了以下程序:

# include <iostream>
# include <cstdlib>
using namespace std;

class Test {};
void * operator new (size_t size) throw (std::bad_alloc){
    cout<<"Calling New:"<<endl;
    return new (malloc(size)) Test() ;
}

void operator delete (void *ptr) throw () {
    cout<<"Calling Delete:"<<endl;
    free (ptr) ;
}

int main ()
{
    cout<<"Hello"<<endl;
    Test *ptr = new Test () ;
    delete ptr ;
    return 0;
}
在输出中,可以看到操作符new被多次调用(即使只创建了一个Test实例),delete被调用的次数更少

谁能告诉我这里出了什么问题吗


谢谢

您的编译有问题:

这里只叫一次

输出为:

Hello
Calling New:
Calling Delete:

或其他事物在后台调用它。

可能发生的是C++库使用<代码>运算符new <代码>来分配内存以实现其内部目的。例如,写入
std::cout
很可能会触发一些内部缓冲区的分配,从而导致对重载的
操作符new

全局
操作符new
的调用应该只获取并返回内存,而不是调用内存上的新位置这行错误得很厉害,应该
返回malloc(size)。或者完全正确地,您应该检查nullptr并抛出一个坏消息_alloc@aschepler/迈克:在发布代码的时候,我心里有一个疑问,就是我做错了什么。无论如何,这就引出了另一个问题:我如何在那个位置初始化对象?我使用的IDE似乎有问题。在UNIX的GCC中编译了相同的代码,并且输出良好。谢谢你的帮助。
Hello
Calling New:
Calling Delete: