首页 > 解决方案 > 为什么取消引用 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;
}

标签: c++nulldereference

解决方案


它之所以有效,是因为 GetFileData 不引用任何类数据。正在调用该函数,并且在“this”参数处传递了一个(隐藏的)空指针。由于该函数不使用“this”,因此它就像一个静态函数一样工作。


推荐阅读