重载运算符新-误导性输出

Overloading operator new - misleading output

本文关键字:误导性 输出 运算符 重载      更新时间:2023-10-16

我正在努力了解放置新/删除是如何工作的,因此我编写了以下程序:

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

对于上面的代码,我得到了以下输出:

Calling New:
Calling New:
Calling New:
Calling New:
Calling New:
Calling New:
Calling Delete:
Calling New:
Calling New:
Calling New:
Calling New:
Calling New:
Calling New:
Calling Delete:
Hello
Calling New:
Calling Delete:

在输出中,可以看到操作符new被调用多次(即使只创建了一个Test实例),delete被调用的次数更少。

有人能告诉我这里出了什么问题吗?

感谢

可能发生的情况是C++库使用operator new为其内部目的分配内存。例如,写入std::cout很可能会触发一些内部缓冲区的分配,从而导致对过载的operator new的调用。

编译出现问题:

https://ideone.com/uegedB

这里只叫一次。

输出为:

Hello
Calling New:
Calling Delete:

或者其他人把它称为背景。