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

I don't understand why I have a dangling pointer

我写过这个方法:

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 + " ERROR: Could not open file.");
}

在另一种方法中,我有这些说明:

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*

函数returns类型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());