我有这个虚拟方法:
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
之后,我收到了错误的分配。
为什么?
答案 0 :(得分:3)
正如BoBTFish指出的那样,您应该将函数签名更改为:
string my_class::to_string() const
因为您在本地修改字符串,而不仅仅是返回对类成员的引用。否则,您只需返回对本地字符串的引用,即UB。
答案 1 :(得分:2)
您返回对局部变量的引用。当函数to_string()退出其作用域时,此变量将过时。如果使用C ++ 11,则可以按值自由返回str。将使用移动语义,不会发生任何复制。
std::string my_class::to_string() const
{
}