为什么我的指针在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();

我对悬垂指针的看法是这样的:

int* a()
{
    auto a = 10;
    return &a

    // a dies here, so &a becomes dangling pointer
}

情况似乎并非如此。

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

回答

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

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

返回的指针std::string::c_str()仅在std::string对象保持活动状态(且未修改)时有效。

readShaderSource()返回一个临时 std::string对象。该临时文件超出范围并在调用readShaderSource().

所以,在这段代码中:

auto vShaderSource = readShaderSource("vshader.glsl").c_str();

临时std::string对象超出范围并;c_str()退出后销毁。因此,您将留下一个指向已释放内存的悬空指针。

而在这段代码中:

auto vShaderStr = readShaderSource("vshader.glsl");
auto vShaderSource = vShaderStr.c_str();

您将临时文件保存std::string到局部变量,然后;readShaderSource()退出后临时文件被销毁。然后您调用c_str()该局部变量,因此只要该局部变量仍在作用域内,返回的指针就会保持有效。

  • aaand you can bind to const reference: `const std::string &ShaderStr = readShaderSource("vshader.glsl");`, in this case it's an extene lifetime (until refences will go out f scope)

以上是为什么我的指针在C++中变成悬空指针?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>