1

私はまだJavaからC++に移行しており、文字列に苦労しています。いくつかの文字列を生成してどこかに保存し、それらを作成したオブジェクトが破棄された後にプログラムで使用できるようにする必要があります。それらを文字列のベクトルに格納しようとしましたが、セグメンテーション違反が発生します-doublefree。私がしていることの基本的なバージョンであり、それは問題を再現します:

#include <string>
#include <sstream>
#include <iostream>
#include <vector>

std::string makeString(){
    std::stringstream s;
    s << "Test string";
    return s.str();
}

int main(){
    std::vector<std::string> storage;
    storage.reserve(1);
    storage[0] = makeString();
    return 0;
}

デバッガーは次の行にエラーをマークします。

storage[0] = makeString();

ここで何が起こっているのか、そしてそれを回避する方法について多くの洞察に感謝します。

4

1 に答える 1

5

vector.reserveベクトルのサイズは変更されません。resizeの代わりにを使用する必要がありreserveます。別のオプションは使用することpush_back()です:

 storage.push_back(makeString());
于 2013-02-08T12:42:23.647 に答える