警告:指针所指向的对象将在完整表达式结束时被销毁,这是针对 std::pair 的。

12

以下代码会导致悬空指针错误。

    std::vector<std::pair<std::string, int>> c;
    for (auto& b : c) {
        const auto& [s, i] = b;
        std::string_view v = s.substr(i);
        std::cout << v;
    }

我认为b保存了对std::pair<std::string, int>的引用,所以s应该是pair对象中字符串的引用。为什么会出现悬空指针错误?我在这里错过了什么吗?godbolt链接:https://godbolt.org/z/4zMvbr


如果您能提供出现错误的代码行数,那将非常有帮助。 - KFL
1个回答

10
std::string_view v = s.substr(i); 中,std::string::substr 通过值返回 std::string,即它返回一个临时的 std::stringstd::string 可以被隐式地 转换std::string_view,后者是由临时 std::string 的底层数组指针 std::string::data() 构造的。在完整表达式之后,临时 std::string 被销毁,std::string_view 持有的指针变成了悬空指针。

It is the programmer's responsibility to ensure that the resulting string view does not outlive the string.

std::string get_string();
int f(std::string_view sv);
 
int x = f(get_string()); // OK
std::string_view sv = get_string(); // Bad: holds a dangling pointer

我明白了。那我应该像这样做吗:string_view v(s.c_str() + i)? - Jaebum
1
@Jaebum 是的,应该没问题。 - songyuanyao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接