为什么我的指针在 C++ 中变成悬空指针?

MyB*_*g18 4 c++

我的主要语言是 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)

情况似乎并非如此。

为什么我必须通过字符串变量?直接访问成员函数不行吗?是否与返回值优化有关?我很困惑...

Rem*_*eau 7

我对悬垂指针的想法是这样的......似乎并非如此。

其实也是一样的情况。只是形式不同。

返回的指针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()该局部变量,因此只要该局部变量仍在作用域内,返回的指针就会保持有效。

  • aa并且您可以绑定到 const 引用:`const std::string &ShaderStr = readShaderSource("vshader.glsl");`,在这种情况下,它是一个延长的生命周期(直到引用超出 f 范围) (2认同)