我不明白为什么我有一个悬空指针
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());
我写过这个方法:
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());