0

newで割り当てられた文字配列があるとします。次に、配列のサイズを変更する場合は、次の2つのうちどちらが最適な方法ですか。1. realloc関数を使用または 2.新しい配列を割り当て、古い配列から新しい配列にデータをコピーしてから、古い配列を削除します。

4

4 に答える 4

2

malloc (not new) を使用してブロックを割り当ててから、realloc を使用します。realloc は、ブロックの後に拡張用に使用できる空き容量を認識しています。

s2 = realloc(s,<size>);
if (s2) {
   s = s2;
}
else {
   free up s and handle the error
}

私が見たほとんどのコードは、realloc の失敗を正しく処理していません。

于 2013-01-04T20:32:34.047 に答える
1

new で割り当てられたバッファに realloc を移植可能に適用することはできません。したがって、あなたの2番目のオプションのみが実行可能です.

std::vector および std::string への切り替えを検討してください。

于 2013-01-04T20:33:14.153 に答える
1

Cの観点から全体の問題について考えていると思います。

を使用して配列を扱っている場合vector、それは動的であり、質問で述べた問題を回避します

例えば

vector v(10); // allocates an array of 10 initialized to 0
v.push_back(42); // added another, so now array is 11 long
于 2013-01-04T20:38:16.953 に答える
1

realloc最初のオプションは、ブロックの後に十分な空き領域がないことがわかった場合のコピーも意味します。(malloc配列の割り当てに使用したとしても、これはreallocまったく使用する唯一の正しいオプションです。)

ただし、再割り当てごとに配列のサイズを 2 倍にする (またはそのサイズに定数 > 1 を掛ける) 場合、「配列を 1 増やす」操作は平均して一定の時間を使用します。定数償却時間を検索します。

初期サイズ n の配列を想定します。新しいサイズ 2n への再割り当てとコピーには 2n ステップのコストがかかりますが、次の n 個の「増加」操作は無料です。

ちなみに、これはstd::vector他の多くの配列コンテナーが内部的に実装されている方法です。

于 2013-01-04T20:38:57.090 に答える