1

我试图了解放置 new/delete 的工作原理,因此我编写了以下程序:

# 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:

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

有人可以建议这里有什么问题吗?

谢谢

4

2 回答 2

3

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

于 2013-07-03T18:51:36.983 回答
0

您的编译有问题:

https://ideone.com/uegedB

这里只调用一次。

输出是:

Hello
Calling New:
Calling Delete:

或者也许其他事情在后台调用它。

于 2013-07-03T18:51:28.940 回答