列表<shared_ptr> </shared_ptr>的分配错误

时间:2012-07-04 13:09:23

标签: c++ c++11 shared-ptr bad-alloc

我有这个虚拟方法:

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;
}

其中childrenstd::list<std::shared_ptr<base_class>>my_class继承base_class。但是,在第一次递归调用(my_class::to_string)之后,以及在我返回这个孩子str之后,我收到了错误的分配。

为什么?

2 个答案:

答案 0 :(得分:3)

正如BoBTFish指出的那样,您应该将函数签名更改为:

string my_class::to_string() const

因为您在本地修改字符串,而不仅仅是返回对类成员的引用。否则,您只需返回对本地字符串的引用,即UB。

答案 1 :(得分:2)

您返回对局部变量的引用。当函数to_string()退出其作用域时,此变量将过时。如果使用C ++ 11,则可以按值自由返回str。将使用移动语义,不会发生任何复制。

std::string my_class::to_string() const
{
}