• ベストアンサー

newでrealloc?

最近気になったのはnewをしたものにもう1度newをするとどうなるかです。 例えば class Test *test=new Test[10]; test=new Test[20]; これは極端な場合ですが、一度newで確保した領域にもう一度newで確保すると、realloc的な動作にはなりませんか? 分かる方いましたら教えてもらえるありがたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

やってることは class Test *test1=new Test[10]; class Test *test2=new Test[20]; と同じで、変数名が変わっただけです。 >class Test *test=new Test[10]; たとえば、これが 8番地から10個確保したとして > test=new Test[20]; は新たに50番地から20個確保、というように、まったく別の領域が確保されます。中身もデフォルトコンストラクタで初期化されます。 (元の)8番地の中身がコピーされるわけでも、領域が拡張されるわけではありません。 では、元の8番地からのがどうなるかというと、確保されたままになります。 「8番地」というアドレスを保存してあった変数testは、後から確保した「50番地」に上書きされてしまったので、もう「8番地」をアクセスする方法はありません。よって、delete[]もできません。

mentalplus
質問者

補足

分かりやすく詳しい解説ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

reallocと同様のことを行いたいのであれば、newを直接使うのではなく、std::vectorを使うようにしましょう。

すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

char *p = malloc(10); p = malloc(20); でrealloc()にならないのと同様に、 最初に作成した分のポインタが行方不明になって、おそらくメモリリークします。 # スマートポインタとかそういう方法などで保護していれば別ですが。

mentalplus
質問者

補足

確かにその通りですね。 回答ありがとうございました。

すると、全ての回答が全文表示されます。