我的主要语言是 C#,我正在学习具有稀缺 C++ 背景的 opengl。
// readShaderSource returns const string
// no warning
auto vShaderStr = readShaderSource("vshader.glsl");
auto vShaderSource = vShaderStr.c_str();
// dangling pointer warning
auto vShaderSource = readShaderSource("vshader.glsl").c_str();
Run Code Online (Sandbox Code Playgroud)
我对悬垂指针的看法是这样的:
int* a()
{
auto a = 10;
return &a
// a dies here, so &a becomes dangling pointer
}
Run Code Online (Sandbox Code Playgroud)
情况似乎并非如此。
为什么我必须通过字符串变量?直接访问成员函数不行吗?是否与返回值优化有关?我很困惑...
我对悬垂指针的想法是这样的......似乎并非如此。
其实也是一样的情况。只是形式不同。
返回的指针std::string::c_str()仅在std::string对象保持活动状态(且未修改)时有效。
readShaderSource()返回一个临时 std::string对象。该临时文件超出范围并在调用readShaderSource().
所以,在这段代码中:
auto vShaderSource = readShaderSource("vshader.glsl").c_str();
Run Code Online (Sandbox Code Playgroud)
临时std::string对象超出范围并;在c_str()退出后销毁。因此,您将留下一个指向已释放内存的悬空指针。
而在这段代码中:
auto vShaderStr = readShaderSource("vshader.glsl");
auto vShaderSource = vShaderStr.c_str();
Run Code Online (Sandbox Code Playgroud)
您将临时文件保存std::string到局部变量,然后;在readShaderSource()退出后临时文件被销毁。然后您调用c_str()该局部变量,因此只要该局部变量仍在作用域内,返回的指针就会保持有效。