将未构造的streambuf指针传入ostream构造函数是否属未定义行为?
问题:这段C++代码是否存在未定义行为?
以下程序是否存在未定义行为?
#include <iostream> // std::{ostream, streambuf} // streambuf的构造函数受保护,因此需要包装类来实例化 struct mystreambuf : public std::streambuf {}; extern mystreambuf sb; // 尚未构造 std::ostream os(&sb); // 此处传入“无效”指针?属于未定义行为吗? mystreambuf sb; // 现在完成构造 int main() { return 0; }
这段代码调用std::ostream构造函数时,传入了一个生命周期尚未开始的std::streambuf对象指针。这是否构成未定义行为?
结论
该代码存在未定义行为,原因如下:
&sb的类型是mystreambuf*,需要转换为std::streambuf*;- 对尚未构造完成、且包含非平凡构造函数的对象进行派生类到基类的指针转换,违反了C++标准中关于类构造/析构阶段指针转换的规则;
- 由于
std::streambuf的构造函数是受保护的,它的实例必然作为基类子对象存在,这类针对未构造基类子对象的指针转换操作,属于标准明确禁止的未定义行为范畴。
内容的提问来源于Stack Exchange,提问作者Scott McPeak
相关产品推荐
相关产品推荐

