成员函数是否在创建任何对象之前保证就绪?

Ara*_*raK 2 c++ pointers

考虑这个例子:

#include <iostream>

class myclass
{
public:
    void print() { std::cout << "myclass"; }
};

int main()
{
    myclass* p = 0x0; // any address

    p->print(); // prints "myclass"
}
Run Code Online (Sandbox Code Playgroud)

我没有print通过myclass类型的对象调用成员函数.相反,我从一个指向内存中随机位置的指针调用它.这是一个定义的行为吗?也就是说,成员函数是否保证在创建任何类型的对象之前执行myclass

Jon*_*ler 11

取消引用null(0)指针正在调用未定义的行为.该程序可以做任何喜欢的事情,包括按预期工作.

在某种程度上,你在这里侥幸成功,因为print()成员函数没有引用任何成员变量(没有任何成员变量),但编译器仍然可能生成会对你造成崩溃的代码.如果成员函数确实引用了任何成员变量,那么您将严重陷入未定义的行为.可能不值得尝试计算您可以执行的操作的范围,因为您正在调用未定义的行为,这可能因编译器,编译器,版本,平台,平台,运行而异.