0

这是定义设置缓冲区的 ostream 子类的便捷方式(MyStreamBuf 是 std::streambuf 的某个子类):

class MyOStream : public std::ostream {
public:
  MyOStream(): std::ostream(&buffer) {}
  // ...
private:
  MyStreamBuffer buffer;
};

这里std::ostream的构造函数在buffer的构造函数之前被调用,所以传入的streambuf*指向的是一个非构造对象,它有虚方法。同样的问题也适用于 ~MyStream(),因为缓冲区在 std::ostream 之前被破坏,因此 std::ostream 的析构函数将查看已破坏的缓冲区对象。

我听说这种技术是安全的,因为标准不允许 std::ostream 在其构造函数和析构函数中调用缓冲区上的方法。真的吗?

请注意,问题不在于这是否真的适用于标准库的当前实现,问题在于它是否保证符合标准。问题也不是如何重写上面的代码来解决这个问题——例如,通过使用多重继承来让缓冲区在 std::ostream 超类之前构造为超类。

4

0 回答 0