【发布时间】:2021-01-01 10:34:26
【问题描述】:
#include <iostream>
#include <string>
using namespace std;
class Check
{
public:
int a{};
string b{};
float c{};
void print()
{
cout << "What!";
}
Check()
{
cout << "Constructor has called";
}
~Check()
{
cout << "Destructor has called ";
}
};
int main()
{
Check* ptr{};
ptr->print(); /*How and why is it working without any error or undefined behaviour even though i did not store an address of object in it */
return 0;
}
我使用的是 Visual Studio 2019 更新版
据我所知,我们可以通过指针访问类的成员,方法是指向类,然后存储该类类型的对象的地址,然后我们可以通过'->'访问成员使用那个指针
【问题讨论】:
-
为什么你认为这不是未定义的行为?这只是 UB 最坏的情况,它似乎可以工作。
-
技术上你所做的是UB。由于
print()不对类的成员做任何事情,因此可以合理地预期即使对象是垃圾,它也只会进行打印。这就是 UB 的含义,即无法保证会发生什么 - 也可能会发生一些正确的行为。 -
未定义的行为意味着该行为未定义,并不意味着它不会“工作”,或者它一定是一个错误。这里定义的意思是由C++标准定义。当您的程序有未定义的行为时,任何事情都可能发生,并且您的编译器没有违反 C++ 标准的任何规则。