1

配置の新規作成/削除がどのように機能するかを理解しようとしているため、次のプログラムを作成しました。

# 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 のインスタンスが 1 つしか作成されていない場合でも)、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 に答える