c++ - 链接方法导致数据损坏

标签 c++

我有一个看起来有点像这样的类结构:

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")); 但是你在上面保存指针

关于c++ - 链接方法导致数据损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16000286/

相关文章:

c++ - 如何解决 gcc-3.4 错误(或者这可能不是错误)?

c++ - C++ 中的局部变量是右值吗?

c++ - 在cpp函数中初始化多个结构

c++ - "function template has already been defined"使用 "std::enable_if_t"

C++ 结构和构造

c++ - 一行 std::vector ctor 映射另一个 vector ?

javascript - V8 console.log 不打印

c++ - 尽管不支持 S3TC,但 DXT 纹理仍然有效

c++ - std::function 和 std::bind 行为

c++ - 在具有 constant_tsc 和 nonstop_tsc 的 cpu 上,为什么我的时间会漂移?