You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将未构造的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:05:24