将未构造的缓冲区传递给std :: ostream的构造函数是否安全?

时间:2012-10-17 10:12:14

标签: c++ std

这是定义设置缓冲区的ostream子类的一种方便方法(MyStreamBuf是std :: streambuf的一些子类):

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

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

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

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

0 个答案:

没有答案