2

配置の新しい演算子に問題があります。Program1 (operator.cpp) と Program2 (main.cpp) の 2 つのプログラムがあります。

プログラム1: operator.cpp

void *operator new(size_t size)
 {
   void *p;
   cout << "From normal new" << endl;
   p=malloc(size);
   return p;
 }
 void *operator new(size_t size, int *p) throw()
 {
    cout << "From placement new" << endl;
    return p;
 }

以下は、最初のプログラムがリンクされている 2 番目のプログラムです: main.cpp:

     #include <new>
      int main()
      {
        int *ptr=new int;
        int *ptr1=new(ptr) int(10);
      }

次のように、operator.cpp と main.cpp を個別にコンパイルしています。

operator.cpp: g++ -g -c -o operator operator.cpp

次に、それを main.cpp とリンクします。

g++ -g -o target operator main.cpp.

驚いたことに、「./target」を実行すると、「From normal new」と出力されます。予想される出力は次のとおりです。

通常新規より 配置新規より

ただし、placement new と main が同じファイル自体に配置されている場合、出力は期待どおりになります。

通常新品より、 配置新品より。

4

1 に答える 1

4

[main.cpp]には<new>、関数を宣言するを含めます

 void* operator new( size_t size, void* p) throw()

独自の関数を宣言することはありません。

したがって、によって宣言された関数はnew、既知の関数と呼び出された関数だけです。

ちなみに、C++98§18.4.1.3/1では、上記の関数の置き換えが禁止されていることに注意してください(さらに、他の3つ、つまり、配置引数のある単一オブジェクトと配列形式new)。deletevoid*

また、私が「ちなみに」コメントしている間、新しい配置が解決策であると考えられるものは何であれ、おそらくより安全で効率的でより明確なより高いレベルの解決策がある可能性があります。

乾杯&hth。、

于 2011-01-14T06:25:34.077 に答える