我创建了一个类{em> App 的NULL
指针,但不知怎的,NULL
对象(App)的方法正在运行。这是我的代码:
#include "App.h"
#include <iostream>
using namespace std;
int main()
{
App* pointer = NULL;
pointer->print();
system("pause");
}
附上了头文件
#pragma once
#include <iostream>
using namespace std;
class App
{
private:
int x;
int y;
public:
App(void);
~App(void);
App(int a, int b)
{
x=a;
y=b;
}
void print()
{
cout<<"hello world"<<endl;
}
};
屏幕显示的运行结果为:hello world
。这是为什么?
答案 0 :(得分:2)
未定义的行为就是 - 未定义。任何事情都可能发生,包括行为正确的表现。
对于您的情况,具体而言,您可能希望从程序中检出生成的程序集。您可能会发现编译器已优化您的代码并内联该打印输出或直接调用它,而不是通过指针/表查找实际调用它。
答案 1 :(得分:1)
在NULL
指针上调用方法是未定义的行为,因此可能发生任何事情。您永远不应指望代码将始终产生此输出的事实。总是尽量避免这种情况。
答案 2 :(得分:1)
取消引用NULL指针是未定义的行为。你不应该期望你的程序不会因为你这样做而“工作”。
在这种情况下,您的打印功能不会“使用”this
指针,因此您的代码会按预期执行。但你不应该依赖于此,未定义的行为就意味着它所说的。
答案 3 :(得分:1)
这是undefined behavior,这个thread解释了为什么它最有可能起作用,基本的解释是它可能会转化为类似的东西:
void _App_print( App* this );
由于您没有使用this
,因此无法使用。
答案 4 :(得分:1)
这是未定义的行为。该实现能够在这个玩具示例中工作,因为print
不访问成员变量并且是非虚函数。
答案 5 :(得分:0)
因为print不会(甚至隐式地)访问“this”指针后面的任何数据。