c++ - 为什么取消引用 NULL 与 cout << g_System->FileSystem()->GetFileData("test.txt"); 一起工作 在这个例子中?
问题描述
FileSystem() 总是返回 NULL 但我仍然可以通过 g_System->FileSystem()->; 调用 EngineFile 的函数
我已经在 VS2017 和一个在线编译器上对此进行了测试。
显然,我的意图不是让 FileSystem() 返回 NULL,因为它的目的是使 Systems.ef 设置为 EngineFile 指针。在我正在处理的一个项目中,我不小心忘记了设置指针,当单步执行一些其他代码时,我意识到它只是返回 NULL 并且它仍在工作。
我已将其压缩为一个文件,因此所有代码都在那里。
为什么这样做以及如何工作?
#include <iostream>
using namespace std;
class EngineFile
{
public:
EngineFile();
~EngineFile();
const char* GetFileData(const char* filename);
void ModifyBool(void);
private:
bool testmodify = false;
};
EngineFile::EngineFile()
{
}
EngineFile::~EngineFile()
{
}
void EngineFile::ModifyBool(void)
{
testmodify = true;
}
const char* EngineFile::GetFileData(const char* filename)
{
// open file filename
// stub function basically
return "This is the file data\n";
}
class Systems
{
public:
Systems();
~Systems();
EngineFile* const FileSystem(void);
private:
EngineFile* ef = NULL;
};
Systems::Systems()
{
}
Systems::~Systems()
{
}
static Systems* g_System;
EngineFile* const Systems::FileSystem(void)
{
return ef;
}
int main()
{
EngineFile* ef = new EngineFile();
g_System = new Systems();
// calling the function directly works as we would think
cout<<ef->GetFileData("test.txt");
// calling it through indirection with FileSystem returning NULL works
// why does this work? I feel like it should not work
cout << g_System->FileSystem()->GetFileData("test.txt");
// this will return null to show FileSystem returns null
EngineFile* efnulltest = g_System->FileSystem();
if (efnulltest == NULL)
cout << "efnulltest is NULL\n";
cout << "some extra text to show previous statement is still working\n";
// segfault as expected
g_System->FileSystem()->ModifyBool();
return 0;
}
解决方案
它之所以有效,是因为 GetFileData 不引用任何类数据。正在调用该函数,并且在“this”参数处传递了一个(隐藏的)空指针。由于该函数不使用“this”,因此它就像一个静态函数一样工作。
推荐阅读
- java - 为什么有一种算法可以在链表中找到循环,而实现应该阻止它们?
- mysql - 如何创建递归函数以找出 MySQL 中的层次顺序
- gnuplot - 如何用 Gnuplot 演示 LaTeX 公式?
- javascript - 如何增加/减少点击 Js/ReactJs 中相同按钮的计数
- r - 基于两行的另一个数据框过滤数据
- android - 我收到了这个找不到的消息语音(没有这样的文件或目录)
- apache-spark - SparkSQL 在第一次出现字符串时拆分字符串
- list - Haskell:飞镖游戏
- powershell - 为什么我在这段代码中使用了太多的磁盘空间?
- javascript - 使用 jQuery .when,如何传入可变数量的函数调用?