从工厂函数返回右值引用时堆/内存损坏

Heap/memory corruption when returning rvalue reference from factory function

本文关键字:内存 损坏 引用 工厂 函数 返回      更新时间:2023-10-16

我有一个这样的类:

class CObj
{
public:
   CObj(std::string const& str) : m_str(str) {}
   static CObj&& Current()
   {
      CObj uxid{"test"};
      return std::move(uxid);
   }
private:
   std::string m_str;
};

我是这样使用的:

CObj obj{CObj::Current()};

obj内部的std::string已损坏/无效。我希望将临时从工厂移走,并移动初始化obj。我做错了什么?

Current的返回类型是引用类型。您正在返回对本地对象的引用,在被调用者尝试访问该对象以构造obj导致未定义行为之前,该引用将被销毁。返回类型是右值引用这一事实与此无关。事实上,问题与左值引用返回类型相同。

如果你想从函数中返回一个新创建的对象,你应该按值返回:

static CObj Current() {
  return {"test"};
}

或:

static CObj Current() {
  CObj uxid{"test"};
  // do stuff with uxid here.
  return uxid;
}

由值返回的局部将自动移动,尽管编译器更有可能应用返回值优化并直接在返回值中构造对象,而不进行任何移动或复制。