3

動的メモリには、固定サイズの配列を設定してその一部を使用するよりも利点があることを知っています。ただし、動的メモリでは、配列に格納するデータの量を入力する必要があります。文字列を使用する場合、必要な数の文字を入力できます (数値に文字列を使用し、関数を使用してそれらを変換することもできます)。この事実から、文字配列の動的メモリは文字列に比べて時代遅れだと思います。

文字列を使用するときの長所と短所は何ですか?文字列が占有するスペースはいつ解放されますか? おそらく、動的に割り当てられたメモリを削除して文字列よりも有利に解放するオプションはありますか? 説明してください。

4

3 に答える 3

7

簡単な答えは、「いいえ、欠点はなく、利点のみです」というのが、std::string文字配列を超える場合です。

もちろん、文字列は動的メモリを使用しますが、事実を舞台裏に隠すだけなので、心配する必要はありません。

あなたの質問への答え: 文字列が占有するスペースはいつ解放されますか? この投稿が役立つ場合があります。基本的に、std::strings はスコープ外になると解放されます。多くの場合、コンパイラはメモリの割り当てと解放のタイミングを決定できます。

于 2013-08-19T11:32:34.713 に答える
6

std::string には通常、動的に割り当てられた内部バッファーが含まれます。データを割り当てるとき、または新しいデータをプッシュバックするときに、現在のバッファー サイズが十分でない場合、サイズを増やした新しいバッファーが割り当てられ、古いデータが新しいバッファーにコピーまたは移動されます。その後、古いバッファの割り当てが解除されます。

文字列が範囲外になると、メイン バッファーの割り当てが解除されます。文字列オブジェクトが (スタック上の) 関数内のローカル変数である場合、現在のコード ブロックの最後で割り当てが解除されます。関数パラメーターの場合は、関数が終了したとき。クラス メンバーの場合は、クラスが破棄されるたびに。

文字列の利点は、柔軟性 (自動的にサイズが大きくなる) と安全性 (配列の境界を超えにくい) です。動的割り当てが不要なため、スタック上の固定サイズの char 配列の方が高速です。ただし、パフォーマンスの問題がある場合は、以前ではなく、それについて心配する必要があります。

于 2013-08-19T12:07:50.367 に答える
0

さて、あなたの質問は私に考えさせました。そして、あなたが構文の違いについて話していることを理解しました.どちらの方法もchar配列を動的に割り当てるためです. 唯一の違いは必要性です。

  • 文を含む文字列を作成する必要がある場合は、使用できます。使用しないでください。malloc
  • 配列が必要で、それを「再生」する場合、つまり、セルコーディングを何らかの方法に変更または設定するか、サイズを変更する場合は、それを開始するmallocのが適切な方法です
  • (たとえば)静的な割り当てに私が見る唯一の理由char a[17]は、必要な単一の目的の文字列のためです。つまり、必要な正確なサイズがわかっている場合にのみ、それは変更されません。

そして、私が見つけた1つの重要なポイント:

動的メモリ割り当てでは、メモリが継続的に割り当てられているが、使用されていないオブジェクトに割り当てられたメモリが解放されない場合、スタック オーバーフロー状態やメモリ リークが発生する可能性があり、これは大きな欠点です。

于 2013-08-19T11:40:13.503 に答える