1

私はこの仮想メソッドを持っています:

const string& my_class::to_string() const
{
    string str(this->name + string(" "));

    if(!this->children.empty())
    {
        for(const std::shared_ptr<base_class> e : this->children)
            str.append(e.get()->to_string());
    }

    return str;
}

はどこchildrenにあり、std::list<std::shared_ptr<base_class>>はをmy_class継承しbase_classます。しかし、(のmy_class::to_string)最初の再帰呼び出しの後、そしてこの子を返した後str、私は悪い割り当てを取得します。

なんで?

4

2 に答える 2

3

BoBTFishが指摘しているように、関数のシグネチャを次のように変更する必要があります。

string my_class::to_string() const

文字列をローカルで変更しているので、クラスメンバーへの参照を返すだけではありません。それ以外の場合は、UBであるローカル文字列への参照を返すだけです。

于 2012-07-04T13:17:35.540 に答える
2

ローカル変数への参照を返します。関数to_string()がスコープを終了すると、この変数は古くなります。C ++ 11を使用する場合は、strを値で自由に返すことができます。移動セマンティクスが使用され、コピーは行われません。

std::string my_class::to_string() const
{
}
于 2012-07-04T13:20:19.737 に答える