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

为何MSVC允许实例化带protected析构的EntityBase?合规性与UB疑问

C++ protected析构函数与未定义行为问题解答

问题1:MSVC与Clang/GCC谁的行为符合C++标准?

Clang/GCC的行为符合C++标准,MSVC的行为属于非标准扩展。

根据C++标准,当类的析构函数被声明为protected时,类外部的代码(既非该类的派生类,也非友元)无法合法创建该类的实例——因为对象生命周期结束时必须调用析构函数,而外部代码没有权限访问protected级别的析构函数。

MSVC在EntityBase与派生类大小一致时允许直接实例化基类,这是它特有的非标准行为;当派生类添加成员后,MSVC拒绝实例化的操作才符合标准要求。

问题2:若Face无额外成员且为平凡可析构类型,通过EntityBase指针删除Face是否仍属于未定义行为?

是的,该操作仍然属于未定义行为。

C++标准明确规定:通过基类指针删除派生类对象时,基类必须拥有虚析构函数,否则行为未定义。这个规则不依赖于派生类是否包含额外成员,也不依赖于析构函数是否为平凡类型——只要基类没有虚析构函数,此类操作的行为就是未定义的,即便编译器执行时看似正常,也绝对不能依赖这种行为。

内容的提问来源于stack exchange,提问作者Stefano Bellotti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:56:01