流输入运算符导致使用clang的分段错误,但适用于gcc

时间:2019-07-17 15:19:55

标签: c++ segmentation-fault clang++

以下代码在用clang编译并与libc ++链接时会导致段错误,但在使用libstc ++或使用gcc进行编译时效果很好。

#include <iostream>
#include <sstream>

class MyStream : public std::ostream {
public:
    MyStream() {
        rdbuf( &buffer );
    }

private:
    std::stringbuf buffer;
};

int main() {
    MyStream stream{};
    stream << "Hello world" << std::endl;
    return 0;
}

Here is the code on wandbox

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

#include <new>

class MyStream : public std::ostream {
public:
    MyStream() : std::ostream( new (buffer) std::stringbuf ) { }
    ~MyStream() {
        using std::stringbuf;
        ((stringbuf*)buffer)->~stringbuf();
    }
private:
    char buffer[sizeof(std::stringbuf)];
};

这应该首先通过placement new初始化缓冲区,并允许您将其传递给ostream