2

断片化についての別の質問からこれを借りましたが、私はそれを気にしません。機能が全くわからないのではないかと心配です。タイプとデータの有効期間の観点から:(

同じデータは、std :: vector(内部メタデータを持つ動的aray型)、その中の文字列データへのポインター(returnパラメーター)、および宣言された戻り型(std:string)によって表されます。

質問:std :: vectorが破棄される場合、データはどのようにして関数から安全に取り出されますか?暗黙的にコピーされていますか?ベクトル内のcharの動的配列は、ベクトルから「切り離され」、std :: string型として返されるため、一括コピーは必要ありませんか?時々、C++とstdライブラリが私を取得しようとしていると思います...

私はしばらくの間C++を使用していますが、このようなものは私の'edinです。

std::string TestFragmentation()
{
    std::vector<char> buffer(500);
    SomeCApiFunction( &buffer[0], buffer.size() ); // Sets buffer to null-terminated string data
    return &buffer[0];
}
4

1 に答える 1

14

aによって保存されたデータstd::vectorは連続していることが保証されているため&buffer[0]、そのデータの先頭への生のポインターを取得します。1

そして、データをコピーするstd::stringをとるコンストラクターがあります。const char *これは、returnステートメントで暗黙的に呼び出されます(コンパイラーは、コンパイル時のエラーを回避するために、最大で1つの暗黙的な変換操作を呼び出すことができます)。

どちらの場合(vectorstring)でも、対応するバッキングバッファのメモリはコンテナクラスによって管理されるため、メモリリークなどの可能性はありません(生のC関数が有効なnullで終了するC-を作成する限り)文字列のスタイルを設定し、バッファの境界を超えて踏みにじることはありません)。


1.ただし、1か所にとどまる保証はありませんのでご注意ください。ベクトルを拡大または縮小するとすぐに、それがメモリ内の別の場所にコピーされ、それを指しているすべての生のポインタが無効になる可能性があります。そして、vectorそれ自体が破壊された場合、もちろん、バッキングデータは無効になります。

于 2012-04-16T21:06:40.727 に答える