2

友人と一緒に、オーバーライドされた new および new[] 演算子を使用してプログラムを作成しました。このコードで文字列配列を作成しようとすると、次のことがわかりました。

string* Test1 = new string[10];

関数が無効なポインターを返します (通常、その値は 8 ビット前方に移動されます。プログラムを x64 プラットフォームにコンパイルしています)。new[] 関数は次のようになります。

void* operator new[] (size_t e)
{
    void* Test2 = operator new(e); 
    return Test2;
}

リターン前にデバッガでプログラムを実行すると、ポインタTest2の値は 0x0000000009dfaa90 でしたが、 の値はTest10x0000000009dfaa98 になりました。
この状況は文字列型でのみ発生します。「int [10]」、「string * [10]」、およびクラスの1つのオブジェクトで同じことを試みましたが、文字列とコードを処理する場合にのみ問題が発生します。

string* Test1 = new string;

完全に正常に動作します。

なぜそれが起こっているのか、それを正しく機能させる方法を誰かが説明してもらえますか?

PS: Visual Studio 2012 Professional を使用しています。

編集:オーバーライドなしでテストしたnew[]ところ、文字列テーブルを作成するときに同じように機能しているため(返されたポインターは、関数が試行するものとは異なりますreturn)、問題にはならないようです。ポインターの値が文字列配列に対してのみ変化する理由と、それを変更できる他の命令がないように思われる場合にどのように変化するかを誰かが説明してもらえますか?

4

1 に答える 1