为什么向 std::ostream 馈送 nullptr 会产生来自操作系统的信号 11,即分段错误,我该如何处理它?

Why does feeding a nullptr to std::ostream produce a signal 11, aka segmentation fault, from the OS, and how do I handle it?

提问人:sesodesa 提问时间:10/2/2019 最后编辑:eyllanescsesodesa 更新时间:10/3/2019 访问量:67

问:

我有一个带有方法的类,我正在尝试测试。该方法本身定义为DateDate::print

void Date::print(std::ostream *printStream) const
{
  invariant();
   *printStream << day_ << '.' << month_ << '.' << year_;
}

测试功能为

void Unittest::print()
{
    // Creating and printing the date into string, checking if ok
    Date d(4, 5, 2000);
    std::ostringstream printStream;
    d.print(&printStream);
    QCOMPARE(printStream.str(), std::string("4.5.2000"));

    // Testing with a nullptr
    d.print(nullptr);
}

有效日期通过测试,没问题,但测试会产生分段错误。我应该如何修改方法定义来处理这种情况?nullptrnullptr

C++ 单元测试 C++11 IOstream nullptr

评论

3赞 Max Langhof 10/2/2019
您正在取消引用 .这是未定义的行为。请注意,您不是在向 提供 而是尝试将其用作 .您期望的行为是什么?nullptr*printStream << ...nullptrstd::ostreamnullptrstd::ostream
1赞 sesodesa 10/2/2019
@Max Langhof啊,没错。也许明智的做法是根本不执行该特定测试?
2赞 Max Langhof 10/2/2019
另一个明智的做法是参考。我不认为该函数在给定 时可以做任何有意义的事情,那么为什么要在语义上允许它呢?printStreamnullptr
1赞 sesodesa 10/2/2019
所以定义为而不是?Date::printvoid Date::print(std::ostream &printStream) const;void Date::print(std::ostream *printStream) const;
1赞 Max Langhof 10/2/2019
是的,这看起来不错。

答: 暂无答案