Segfault同时传递ostream作为参考

时间:2017-10-25 08:11:32

标签: c++

我正在编写一个输出为stdout或文件的代码。为此,我发现使用@objc func handleTapFrom(recognizer : UITapGestureRecognizer) { // Some code... } 很方便。好像我没有适当地使用它。这是一个最小的例子:

ostream

代码编译得很好,但我在运行时遇到了分段错误。 Valgrind说#include <fstream> struct A { std::ostream *os; A (const char *fn) { std::filebuf fb; fb.open (fn, std::ios::out); os = new std::ostream(&fb); } std::ostream &getOS () { return *os; } }; int main(int argc, char **argv) { A a("foo.txt"); a.getOS() << "bar" << std::endl; return 0; } ,但我无法正确解读。同样,gdb给出了违规行(调用Use of uninitialised value of size 8),但我不知道如何纠正它。

1 个答案:

答案 0 :(得分:4)

正如@Jodocus评论的那样,变量 std :: filebuf fb 在构造函数中是本地的。当它超出范围时它将被销毁。通过将 std :: filebuf fb 定义为成员变量,可以解决该问题。

#include <fstream>

struct A 
{
    std::ostream *os;
    std::filebuf fb;

    A (const char *fn) 
    {       
        fb.open (fn, std::ios::out);
        os = new std::ostream(&fb);
    }

    std::ostream &getOS () 
    {
        return *os;
    }
};

int main(int argc, char **argv) 
{
    A a("/home/test.txt");
    a.getOS() << "bar" << std::endl;
    return 0;
}