0

そのサンプルソースを入手しました:

std::string tmp1;
std::string tmp2 = "Test";


while(1)
{
    tmp1 += tmp2;
}

tmp1 が tmp2 のコンテンツを取得し、各ループで文字列の末尾に「Test」が追加されていることがわかります。これはstrcat()に似ているはずですが、 strcat は C 関数であり、C 関数realloc()を持っています。

std::string は文字列の連結をどのように実装しますか? ある種のメモリの再割り当てを使用しますか? はいの場合、C++ で再割り当てするにはどうすればよいですか?

4

1 に答える 1

3

まず、strcat()メモリを割り当てません! 提供するバッファーが小さすぎるとstrcat()、再割り当てではなく、バッファー オーバーランが発生します。

このstd::stringクラスは内部的にメモリを管理します。new および delete 演算子を使用する適切なシーケンスを使用して、メモリを再割り当てします。このように指定すると、メモリが過剰に割り当てられ、文字列が追加されるたびに新しいメモリが割り当てられなくなります。

可変サイズのメモリを使用する必要がある場合はstd::vector<T>、適切な typeを使用することをお勧めしますT。このクラスは、メモリの割り当てと解放を処理します。必要な要素の数を指定するだけです。内部では、メモリを維持するために new 演算子と delete 演算子 (実際にはアロケーター オブジェクト) の組み合わせも使用しています。C のようなものに対する直接的なサポートはありませんrealloc()

于 2012-10-20T21:01:59.840 に答える