2

我创建了一个NULLApp的指针,但不知何故,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。这是为什么?

4

6 回答 6

2

未定义的行为就是这样 - 未定义。任何事情都可能发生,包括行为正确的外观。

对于您的情况,具体来说,您可能希望从程序中检查生成的程序集。您可能会发现编译器已经优化了您的代码并内联了该打印输出或直接调用它,而不是通过指针/表查找实际调用它。

于 2013-04-25T14:24:19.267 回答
1

在指针上调用方法NULL是未定义的行为,因此任何事情都可能发生。你永远不应该指望代码总是会产生这个输出。总是尽量避免这种情况。

于 2013-04-25T14:24:21.447 回答
1

取消引用 NULL 指针是未定义的行为。你不应该仅仅因为你这样做就期望你的程序不能“工作”。

在这种情况下,您的打印函数不会“使用”this指针,因此您的代码会按预期执行。但是你不应该依赖这个,未定义的行为意味着它所说的。

于 2013-04-25T14:24:54.317 回答
1

这是未定义的行为,该线程解释了为什么它最有可能起作用,基本解释是它可能会转换为类似于:

void _App_print( App* this ); 

并且由于您没有使用this它。

于 2013-04-25T14:25:25.107 回答
1

这是未定义的行为。该实现能够在这个玩具示例中工作,因为print它不访问成员变量并且是一个非虚拟函数。

于 2013-04-25T14:27:36.360 回答
0

因为 print 不会(甚至隐式地)访问“this”指针后面的任何数据。

于 2013-04-25T14:25:14.763 回答