如果没有endl,则重载的ostream操作符分段错误

时间:2013-04-03 13:27:48

标签: c++ vector operator-overloading ostream

class foo {
    public:
    friend ostream& operator << (ostream &os, const foo &f);
    foo(int n) : a(n) {}
    private:
    vector <int> a;
};

ostream& operator << (ostream &os, const foo &f) {
    for (int i = 0; i < f.a.size(); ++i)
        os << f.a[i] << " ";
    os << endl; // why is this line a must?
}

int main(void) {
    foo f(2);
    cout << f << endl;
    return 0;
}

在上面的代码中,如果标记的行被删除,会出现段错误,有人可以解释一下原因吗?

1 个答案:

答案 0 :(得分:17)

ostream& operator << (ostream &os, const foo &f) {
    for (int i = 0; i < f.a.size(); ++i)
        os << f.a[i] << " ";
    os << endl; // why is this line a must?
}

不是躁情。由于您没有返回os

,因此导致了段错误
ostream& operator << (ostream &os, const foo &f) {
    for (int i = 0; i < f.a.size(); ++i)
        os << f.a[i] << " ";
    return os; // Here
}

如果您不返回ostream,则它是未定义的行为。 endl正在冲洗您的os。这就是为什么它似乎正在发挥作用。

编辑:根据Bo Persson的说法,为什么它在这种情况下工作

  

os&lt;&lt; ENDL;是另一个实际返回os的操作符调用   将其置于“预期返回值的地方”(可能是注册)。   当代码返回另一个级别为main时,对os的引用是   还在那里