Why doesn#39;t the program crash when I call a member function through a null pointer in C++?(为什么在C++中通过空指针调用成员函数时程序不会崩溃?)
问题描述
#include "iostream"
using namespace std;
class A
{
public:
void mprint()
{
cout<<"
TESTING NULL POINTER";
}
};
int main()
{
A *a = NULL;
a->mprint();
return 0;
}
我得到的输出是TESTING NULL POINTER".任何人都可以解释为什么这个程序打印输出而不是崩溃.我在 Dev C++ 和 aCC 编译器上检查过都给出了相同的结果.
I am getting output as "TESTING NULL POINTER". Can anyone please explain why this program is printing the output instead of crashing. I checked it on Dev C++ and aCC compiler both gave same result.
推荐答案
您没有使用 A
的任何成员变量 - 该函数完全独立于 A
实例,因此生成的代码碰巧不包含取消引用 0 的任何内容.这仍然是未定义行为 - 它可能恰好在某些编译器上工作.未定义的行为意味着任何事情都可能发生"——包括程序碰巧按照程序员的预期工作.
You're not using any member variables of A
- the function is completely independent of the A
instance, and therefore the generated code happens to not contain anything that dereferences 0. This is still undefined behavior - it just may happen to work on some compilers. Undefined behavior means "anything can happen" - including that the program happens to work as the programmer expected.
如果你例如使 mprint
成为虚拟的,您可能会崩溃 - 或者如果编译器发现它并不真正需要 vtable,您可能不会崩溃.
If you e.g. make mprint
virtual you may get a crash - or you may not get one if the compiler sees that it doesn't really need a vtable.
如果你给 A 添加一个成员变量并打印出来,你会崩溃.
If you add a member variable to A and print this, you will get a crash.
这篇关于为什么在C++中通过空指针调用成员函数时程序不会崩溃?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么在C++中通过空指针调用成员函数时程序不会崩溃?
基础教程推荐
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- Windows Media Foundation 录制音频 2021-01-01