我不明白我为什么有一个悬空指针

我已经写了这个方法:

std::string Utils::GetFileContents(const char* filePath)
{
    std::ifstream in(filePath, std::ios::binary);

    if (in)
    {
        std::string contents;
        in.seekg(0, std::ios::end);
        contents.resize(in.tellg());
        in.seekg(0, std::ios::beg);
        in.read(&contents[0], contents.size());
        in.close();
        return(contents);
    }

    throw(errno + "错误:无法打开文件。");
}

在另一个方法中,我有以下指令:

lua_State* state = luaL_newstate();

const char* code = Utils::GetFileContents(path).c_str();
luaL_dostring(state, code);

lua_close(state);

如果在前一个方法中运行调试器,则会得到一个指向 code 变量的悬空指针。我不明白为什么。

我找到了一种让它工作的方法 - 基本上是将 code 存储在 std::string 中,然后将下一行更改为 luaL_dostring(state, code.c_str());

这对我来说毫无意义,因为在这两种情况下,code 都被存储为 const char*

原文链接 https://stackoverflow.com/questions/71116990

点赞
stackoverflow用户2877241
stackoverflow用户2877241

这个函数返回一个类型为 std::string 的对象。

std::string Utils::GetFileContents(const char* filePath)

你正在用返回的临时字符串的第一个字符的地址来分配一个指针。

const char* code = Utils::GetFileContents(path).c_str();

声明后,返回的临时对象将被销毁。 因此指针 code 是无效的,并在下一次调用时使用

luaL_dostring(state, code);

会引发未定义的行为。

例如,您可以编写以下内容

std::string code = Utils::GetFileContents(path);
luaL_dostring(state, code.c_str());
2022-02-14 19:07:07