可能性の重複:
How do you
C++配列のメモリの再割り当て。realloc
in C++?
Iメモリがmalloc()
又はcalloc()
を介して割り当てられている場合C++配列はrealloc()
を使用して(拡大)再割り当てすることができることを知っています。私の質問は、どのようにメモリがnew
演算子を介して割り当てられているC++で配列を展開できますか?
可能性の重複:
How do you
C++配列のメモリの再割り当て。realloc
in C++?
Iメモリがmalloc()
又はcalloc()
を介して割り当てられている場合C++配列はrealloc()
を使用して(拡大)再割り当てすることができることを知っています。私の質問は、どのようにメモリがnew
演算子を介して割り当てられているC++で配列を展開できますか?
C++ではstd::vector<>
を使用しています。
これを行うには、新しい配列を(new
経由で)割り当て、次に古い項目を(std::copy
)にコピーしてから、前の配列delete[]
にコピーする必要があります。
だけstd::vector
を使用 -
+1 'std :: vector'。 –
「古いアイテムをコピーする」または移動する。 –
使用::std::vector
...それはあなたのためにすべてのものをやらせます。
詳しくはthis questionまたはthis questionをご覧ください。
通常、ストレージがmalloc
で割り当てられていても、C++配列はrealloc
で再割り当てできません。 malloc
は配列を与えません。使用可能なストレージへのポインタを提供します。ここには微妙な違いがあります。
PODタイプの場合、使用可能なストレージと実際のオブジェクトの間にはほとんど違いがありません。しかし、非PODタイプの場合、使用可能なストレージとオブジェクトはまったく異なるものです。
realloc
は、使用可能なストレージの大部分を提供します。それは記憶装置ではなく、オブジェクトを操作します。それはPODタイプでうまくいくかもしれませんが、他のタイプの場合は災害のためのレシピです。
技術的には 'calloc()'で割り当てられた 'realloc()'や 'malloc()'でメモリが確保されている場合にのみ 'realloc()'を使って配列を展開することは可能ですか? –
@amalantonyああ、同じことが 'calloc'になります。問題は 'realloc'自体にあります。オブジェクトは気にせず、ストレージだけを気にします。 –
@amal: 'malloc'と' calloc'の違いは、Martinhoがここで言っていることとはまったく無関係です。非PODオブジェクトを 'realloc'することはできません。なぜなら、それらをバイト単位でコピーすることができないからです。すべての' realloc'がそうするように定義されています。 Cであっても、オブジェクトにポインタが含まれていたり、ポインタが相互にある場合は、アドレスが正しくないため、ポインタを「再割り当て」できません。 C++では、POD以外のクラスでは、実装自体がそれに合ったものを挿入するという警告が追加されています。 –
malloc/reallocはCライブラリ呼び出しです。C++で使用することはできますが、C++は動的配列などを取り扱うより堅牢な方法を持っているので避けるべきです。 –