链接方法会导致数据损坏
Chaining methods causes data corruption
我有一个类结构,看起来有点像这样:
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)
我该如何解决这个问题?
你的Bar
实例在f.AddElement(Bar().AddPart(10,"abcd").AddPart(5,"xyz").AddPart(20, "jklm"));
之后被销毁但是你保存了它的指针
再考虑一下,当您将指向右值(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"));
相关文章:
- 为什么C中的通用链表中存储的数据已损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 类数组正在损坏数据
- 带有zip_source_buffer的libzip会导致数据损坏和/或segfault
- 发送特定字节模式时串行端口数据损坏
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- Winapi ReadFile返回损坏的数据
- 向量元素数据损坏了Find()操作
- Boost 的数据驱动测试的联接运算符"+"损坏了第一列
- 为什么链表中的数据在嵌套函数中会更改/损坏?
- 写入文本文件的数据部分损坏且无法恢复
- C++和Python之间的数据损坏管道
- 内存中的数据损坏
- 如何在不存在任何数据损坏风险的情况下序列化对象
- 使用 IOCP 的 TCP/IP 服务器.接收缓冲区中偶尔的数据损坏
- 尝试读入内存时检查磁盘上文件的二进制数据损坏情况
- 文件结构,以避免数据损坏
- boost::async_write导致数据损坏
- 链接方法会导致数据损坏
- 通过复制捕获Lambda函数会导致数据损坏