0

以下は、スレッド ビルディング ブロック (オープン ソース 4.1) をサポートする Visual Studio 10 で実行されている単純な VC++ プログラムのスニペットです。

サンプルからプログラムをコンパイルして実行したところ、cout からの new 演算子の出力を見て驚きました。

int main() {
  string str[N] = { string("a"), string("b") };
  for (size_t i = 2; i < N; ++i) str[i] = str[i-1]+str[i-2];
  string &to_scan = str[N-1];
  size_t num_elem = to_scan.size();

  size_t *max = new size_t[num_elem];
  size_t *pos = new size_t[num_elem];
  cout <<"*max : " << *max<< ", "<<"*pos :"<<*pos<<endl;
......
......

cout の出力は次のようになります。

*最大: 3452816845, *位置: 3452816845

驚いたことに、どちらの場合も max と pos の値が同じです。

これはおそらく、ライブラリ内の new 演算子のオーバーロードが原因でしょうか?

また

これは報告すべきバグですか?

また

これはただの偶然ですか?

4

1 に答える 1

0

ヒープに新しく割り当てられた領域の内容は、標準型の new 演算子によって初期化されないため、未定義です。値は 16 進数で 0xCDCDCDCD に変換されます。何らかの理由で完全なヒープ領域がこのパターンで満たされていると思います。

詳細:

  • ヒープに size_t 型の 2 つの配列を割り当てます。size_t は unsigned int の typedef であるため、opreator new は (malloc のように) ヒープにスペースを割り当てるだけですが、コンストラクターを呼び出したり、メモリを初期化したりすることはありません。
  • 割り当てられた配列は、size_t 型のポインターに割り当てられ、配列の最初の要素を指します。
  • cout ステートメントは、ポインターが指すメモリーの内容を出力しています (ポインターが逆参照されるため)。これには、以前に格納されていたものが含まれています。
于 2012-10-04T19:35:38.363 に答える