アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (3件)

やってることは


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[]もできません。

この回答への補足

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

補足日時:2010/03/13 01:25
    • good
    • 0

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

    • good
    • 0

char *p = malloc(10);


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

この回答への補足

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

補足日時:2010/03/13 01:25
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!