我接受了以下面试问题:
class A
{
public:
    void fun()
    {
        std::cout << "fun" << std::endl;
    }
};
A* a = NULL;
a->fun();
执行此代码时会发生什么,为什么?
sth*_*sth 57
这是未定义的行为,所以任何事情都可能发生.
一个可能的结果是它只是打印,"fun"因为该方法不访问它被调用的对象的任何成员变量(不需要访问对象所在的内存,因此不一定会发生访问冲突).
Dan*_*erg 22
按照标准,这是不确定的行为,因此是一件非常糟糕的事情.实际上,大多数编程平台(跨X86和其他几种架构)都可以正常运行.
为什么?考虑如何在C++中实现类函数.这不是虚函数,因此可以是对已知地址的静态调用.在x86汇编中,我们可以看到这一点
mov A, 0
mov ecx, A
call a__fun
因为a__fun不需要实例数据,即使它接收到null这个指针,也不会发生任何事情.
仍然糟糕的代码和任何编译器都会尖叫,但它可以运行.
Ken*_*oom 15
在大多数现代计算机上,最可能的行为是它将运行并打印"有趣",因为:
fun() 不是虚拟的,所以不需要引用vtable来调用 fun()fun()永远不会访问任何成员变量,A因此不需要取消引用空this指针.小智 5
三点可能会有所帮助:
1) 所有函数都存储在代码或文本部分。
2) 非虚函数在编译时解析。
3)在调用类的成员函数时,我们将当前对象作为this指向该函数的指针传递。
说到你的问题,这里的fun()函数已经在内存中(代码部分/文本部分)。由于函数fun()是非 virtual ,它将在编译时解析(即,对于这一行,它将跳转到代码段处的指令 X ,指针为thisas NULL)。由于函数中没有使用/调用成员变量和虚函数fun(),因此它工作正常。
| 归档时间: | 
 | 
| 查看次数: | 9450 次 | 
| 最近记录: |