記述内容 here 、new
はfree storeに割り当て、malloc
はheapと2つの用語はしばしば同じことを意味します。
記述内容 here から、realloc
はメモリブロックを新しい場所に移動する場合があります。無料のストアとヒープが2つの異なるメモリ空間である場合、それは何か問題を意味しますか?
具体的には安全に使用できるかどうか知りたい
int* data = new int[3];
// ...
int* mydata = (int*)realloc(data,6*sizeof(int));
そうでない場合、realloc
で安全にnew
メモリを割り当てる他の方法はありますか?新しい領域とmemcpy
の内容を割り当てることができましたが、私が理解しているところによると、realloc
は可能であれば同じ領域を使用する場合があります。
C++がrealloc
に追加する可能性のある唯一の制限は、C++のmalloc
/calloc
/realloc
を::operator new
に関して実装してはならないことです。そしてそのfree
は::operator delete
の観点から実装してはなりません(C++ 14 [c.malloc] p3-4による)。
これは、探している保証がC++に存在しないことを意味します。ただし、これは、malloc
に関して::operator new
を実装できることも意味します。そして、それを行うと、理論的には、::operator new
の結果をrealloc
に渡すことができます。
実際には、new
の結果が::operator new
の結果と一致しない可能性について心配する必要があります。 C++コンパイラは、複数のnew
式を組み合わせて、1つの::operator new
呼び出しを使用します。これは、標準で許可されていないときにコンパイラーがすでに行っていたものであり、IIRCであり、標準では許可されています(C++ 14 [expr.new] p10ごと)。つまり、この経路をたどったとしても、new
ポインタをrealloc
に渡すことが、未定義の動作ではなくなったとしても、意味のあることを実行できるという保証はありません。
一般に、それを行わないでください。 非自明な初期化でユーザー定義型を使用している場合、再割り当てコピー解放の場合、オブジェクトのデストラクタが勝ちますrealloc
によって呼び出されない。コピーするとき、コピーconstructorも呼び出されません。これは、object lifetime(を参照)の誤った使用により、未定義の動作を引き起こす可能性があります。 [basic.life])。
1オブジェクトの存続期間は、オブジェクトの実行時プロパティです。オブジェクトがクラスまたは集約型であり、そのメンバーの1つが自明なデフォルトコンストラクター以外のコンストラクターによって初期化されている場合、そのオブジェクトは自明ではない初期化を持つと言われます。 [注:簡単なコピー/移動コンストラクタによる初期化は、重要な初期化ではありません。 —エンドノート]
タイプTのオブジェクトの存続期間は、次の場合に始まります。
—タイプTの適切な配置とサイズのストレージが取得されます。
—オブジェクトに重要な初期化がある場合、その初期化は完了しています。
タイプTのオブジェクトの存続期間は、次の場合に終了します。
— Tが重要なデストラクタ(12.4)を持つクラス型の場合、デストラクタ呼び出しが開始されます。
—オブジェクトが占有するストレージは再利用または解放されます。
そして後で(私の強調):
3この国際規格全体でオブジェクトに帰属するプロパティは、特定のオブジェクトに適用されますその存続期間中のみ。
そのため、オブジェクトのライフタイムのoutを使用したくないのです。
安全ではなく、エレガントでもありません。
再割り当てをサポートするためにnew/deleteをオーバーライドすることは可能ですが、その場合はコンテナーの使用を検討することもできます。
はい-new
が最初に実際にmalloc
を呼び出した場合(たとえば、これはVC++ new
が機能する方法です)。
それ以外はありません。 (new
がmalloc
と呼ばれるため)メモリの再割り当てを決定すると、コードはコンパイラ固有であり、コンパイラ間で移植できなくなります。
(私はこの答えが多くの開発者を混乱させるかもしれないことを知っていますが、私は答えは慣用性だけでなく実際の事実に依存します)。
それは安全ではありません。まず、realloc
に渡すポインターは、malloc
またはrealloc
から取得したものである必要があります。 http://en.cppreference.com/w/cpp/memory/c/realloc 。
第2に、new int [3]
の結果は、割り当て関数の結果と同じである必要はありません-要素の数を格納するために追加のスペースを割り当てることができます。
(そしてint
よりも複雑な型の場合、realloc
はコピーまたは移動コンストラクターを呼び出さないため、安全ではありません。)
一般的には違います。
安全にするために守らなければならないことがたくさんあります。
自明な型は上記の要件を満たします。
加えて:
new[]
- functionは、変更を加えずにmalloc
にリクエストを渡す必要があります。また、サイドでの簿記も行いません。これを強制するには、グローバルnew []とdelete []、またはそれぞれのクラスのものを置き換えます。(すべての場合ではありませんが)できるかもしれませんが、できないはずです。データテーブルのサイズを変更する必要がある場合は、std::vector
代わりに。
使用方法の詳細は、他の SO質問 に記載されています。