从工厂函数返回右值引用时堆/内存损坏
Heap/memory corruption when returning rvalue reference from factory function
我有一个这样的类:
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;
}
由值返回的局部将自动移动,尽管编译器更有可能应用返回值优化并直接在返回值中构造对象,而不进行任何移动或复制。
相关文章:
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 正在调试 malloc():新内存损坏
- 仅特定内核计数上的 MPI 内存损坏
- C++程序错误:malloc():内存损坏
- 调用std::函数成员时内存损坏
- C++ 内存损坏检测
- 由于标头中的 #define 不匹配而导致内存损坏
- C STD ::线程中的种族状况或内存损坏
- malloc()内存损坏仅通过为特定数量编写int数组
- 字符串标记化期间的内存损坏
- 从检测到 glibc 正常退出 - malloc():内存损坏
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- std :: string ::擦除会导致内存损坏
- 编译器如何检测内存损坏
- mix_playMusic导致内存损坏
- 在使用新操作员和C 中的结构的调用构造函数时,获得内存损坏(Malloc)
- 两个内联程序集调用与一个内联程序集调用中的内存损坏?
- 如何调试不确定内存损坏?
- 增强Dijkstra代码会导致片段内存损坏
- 内存损坏从vb.net调用c dll