c++ - 为什么这不会创建悬空引用?

标签 c++ reference visual-studio-2019 dangling-pointer

C26830: Assigning by value when a const-reference would suffice
我认为 VS2019 建议会创建一个悬空的引用情况,但我对其进行了测试,它似乎有效。这里发生了什么?


    template<typename MessageType>
    class Queue {
      inline static std::vector<MessageType> messages;
    public:
      static bool isEmpty() {
        return messages.size() == 0;
      }

      template <typename... Args>
      static void emplace(Args&&... args) {
        messages.emplace_back(std::forward<Args>(args)...);
      }

      static MessageType pop() {
        auto const& val = messages.back();
        messages.pop_back();
        return val;
      }
    };
看起来最后一条消息存活的时间足够长,可以复制到返回值中。这是好的做法吗?

最佳答案

It looks like the last message stays alive long enough to be copied into the return value. Is this good practice?


不幸的是,不,不是,也不是。 std::vector<T>::back的返回类型是一个左值引用。也许智能感知认为它是一个右值引用,在这种情况下,由于规则here,它的生命周期会被延长。 .
但事实并非如此,这里的用法是未定义的行为。这是因为引用所指的列表中的项目已被销毁。它可能仍然有效的原因是因为该项目的内存仍然存在,因此可以正确读取。这只是运气(或不幸,如果您希望能够找到这些错误)。如果元素被 pop_back 破坏持有其他内存,那么您可能会看到不同的结果,例如 SEGFAULT。

关于c++ - 为什么这不会创建悬空引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67612546/

相关文章:

c# - 在 View 中允许可空模型

visual-studio - VS2019 : How to disable the error navigator in the scrollbar?

c++ - 为什么 std::string 引用不能带 char*?

javascript - Reactjs:如何通过索引或键引用访问动态渲染的数组元素?

c++ - 是否可以将const unique_ptr引用(派生类)转换为shared_ptr(基类)

php - 在 ID 上连接了 2 个表,工作正常,但现在我想回显另一个表的 ID

perl - 你能在 Perl 中强制标量或数组引用成为数组吗?

asp.net-core - Visual Studio 2019 与 ASP.NET Core 挂起(无响应)

c++ - 构建时的 qmake 问题 : infinite building

c++ - "[ptr, ptr+len) must be a valid range"是什么意思?