我有一个看起来像这样的类结构:
class Bar
{
public:
Bar & AddPart(int size, const string & name)
{
partitions.insert(pair<string, int>(name,size));
return *this;
}
void PrintParts(ostream & os) const
{
map<string, int>::const_iterator it;
for (it = partitions.begin(); it != partitions.end(); ++it)
{
os << it->first << " " << it->second << endl;
}
}
private:
std::map<string, int> parts;
}
class Foo
{
public:
Foo & AddElement(Bar &a)
{
elements.push_back(&a);
return *this;
}
private:
vector<Bar *> elements;
};
我返回当前类实例的原因是能够链接方法调用,如下所示:
Foo f();
f.AddElement(Bar().AddPart(10,"abcd").AddPart(5,"xyz").AddPart(20, "jklm"));
问题是,当我调用这些链式方法然后尝试打印数据时,它已损坏。而不是获得预期的输出,这应该是这样的:
abcd 10
xyz 5
jklm 20
我得到的随机字符甚至无法显示。
我尝试通过valgrind运行它,但是我遇到了很多错误,非常类似于这个错误:
Invalid read of size 8
==3347== at 0x4EC6690: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17)
我该如何解决这个问题?
答案 0 :(得分:5)
你Bar
的实例在f.AddElement(Bar().AddPart(10,"abcd").AddPart(5,"xyz").AddPart(20, "jklm"));
之后被摧毁但是你将指针保存在它上面
答案 1 :(得分:2)
再次想一想当你将rvalue(Bar()
)的指针放入elements
时会发生什么:
Foo & AddElement(Bar &a)
{
elements.push_back(&a); // <--- Here you take address of temporary Bar()
return *this;
}
f.AddElement(Bar().AddPart(10,"abcd").AddPart(5,"xyz").AddPart(20, "jklm"));