调用空指针指向的无类数据依赖成员方法,是否属于C++未定义行为?
空指针调用无成员数据的类成员方法是否属于C++未定义行为?
示例代码
class A { public: A() { std::cout << "Constructor\n"; } ~A() { std::cout << "Deconstructor\n"; } void hi() { std::cout << "hi"; } }; int main() { A *p = nullptr; p->hi(); return 0; }
结论
这种情况属于C++标准定义的未定义行为
原因分析
- C++标准明确规定,通过空指针访问类成员的行为本身就是未定义的,无论成员方法是否实际访问了类的内部数据或者
this指针。 - 部分编译器下这段代码能正常运行,只是因为编译器对非虚成员方法的调用做了优化——将其处理为类似普通函数的调用,跳过了
this指针的有效性检查,但这只是特定实现的行为,并非标准所要求的。 - GCC开启
-fanalyze选项时发出警告,正是因为该工具检测到了这种违反标准的风险行为,提醒开发者潜在的问题。
补充说明
即使当前代码在MSVC或默认设置的GCC下没有报错,也不能认为这段代码是合法的。在不同编译器、不同编译选项或者未来的标准版本中,这类代码可能出现不可预料的结果,比如程序崩溃、输出异常等,绝对不能依赖这种行为。
内容的提问来源于stack exchange,提问作者pm100
相关产品推荐
相关产品推荐

