boost :: iostreams sink device:为什么这个琐碎的测试代码会崩溃?

时间:2018-03-27 20:02:36

标签: c++ boost-iostreams

我正在尝试熟悉使用boost :: iostreams。看看iostreams教程,看来这个测试代码应该是一个简单的宿设备实现和流模板:

#include <iostream>
#include <iosfwd>

#include <boost/iostreams/categories.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/concepts.hpp>

namespace io = boost::iostreams;

class testSink {
public:
    typedef char            char_type;
    typedef io::sink_tag    category;

    std::streamsize write(const char* s, std::streamsize n) {
        std::cout.write(s, n);
        return n;
    }
};

int main(int argc, char *argv[])
{
    io::stream<testSink>    out;
    out << "Hello" << std::endl;
    return EXIT_SUCCESS;
}

在linux和g ++(g ++(GCC)4.8.5 20150623(Red Hat 4.8.5-16))下编译成功没有错误,但运行它会因断言失败而崩溃:

  

/usr/local/include/boost/iostreams/detail/optional.hpp:55:T&amp; boost :: iostreams :: detail :: optional :: operator *()[with T = boost :: iostreams :: detail :: concept_adapter]:断言`initialized_'失败。   中止(核心倾销)

显然有一些未记录的初始化步骤,但是什么?

由于

2 个答案:

答案 0 :(得分:0)

缺少的初始化步骤是调用“open”。提升文档似乎不太清楚 - 我从阅读源代码中得出结论。事实上,我正在使用的文档(1.55)中的示例遇到了与您面临的问题相同的问题。

以下是我为你修改testSink的方法:我添加了一个构造函数,它接受一个ostream的引用,然后将std :: cout传递给open()方法。

class testSink {
public:
    typedef char            char_type;
    typedef io::sink_tag    category;

    testSink(std::ostream &out) : out_(out) { }

    std::streamsize write(const char* s, std::streamsize n) {
        out_.write(s, n);
        return n;
    }

private:
    std::ostream& out_;
};

然后这是主要功能:

io::stream<testSink>    out;
out.open(std::cout);
out << "Hello" << std::endl;

答案 1 :(得分:0)

我遇到了同样的问题,调用non-default constructor of the stream object传递一个接收器对象解决了这个问题(根据文档,非默认构造函数创建了一个准备执行I / O的流)。

因此,您的示例对主要功能进行了以下更改:

int main(int argc, char *argv[])
{
    testSink t;
    io::stream<testSink>    out(t); // <---- call non-default constructor passing a testSink object
    out << "Hello" << std::endl;
    return EXIT_SUCCESS;
}

下面是在Coliru上运行的示例。