gpt4 book ai didi

c++ - 引用类型返回函数 : how to return (optional) object

转载 作者:太空宇宙 更新时间:2023-11-04 15:30:35 24 4
gpt4 key购买 nike

我有一个多线程 C++ 应用程序,它可以从任何线程调用如下函数,以从列表/vector 中获取对象。

class GlobalClass{
public:
MyObject* GlobalClass::getObject(int index) const
{
/* mutex lock & unlock */

if (m_list.hasValueAt(index))
return m_list[index];
else
return 0;
}
List<MyObject*> m_list;
};

//Thread function
MyObject* obj = globalClass->getObject(0);
if (!obj) return;
obj->doSomething();

注意:这里的范围是了解一些与通过引用、值或指针返回函数相关的最佳实践,因此请原谅一些伪代码或缺少声明(我使用锁定/解锁、GlobalClass 是一个全局单例,等等...)。

这里的问题是,如果在 GlobalClass 中删除了那个索引处的 MyObject,在某个时候我使用了一个错误的指针 (obj)。

所以我在考虑返回该对象的拷贝:

     MyObject GlobalClass::getObject(int index) const
{
/* mutex lock & unlock */

if (m_list.hasValueAt(index))
return MyObject(*m_list[index]);
else
return MyObject();
}

这里的问题是返回的对象 (MyObject) 是一个足够大的对象,返回拷贝效率不高。

最后,我想返回对该对象的引用(最好是 const 引用):

     const MyObject& GlobalClass::getObject(int index) const
{
/* mutex lock & unlock */

if (m_list.hasValueAt(index))
return *m_list[index];
else{
MyObject* obj = new MyObject();
return *obj ;
}
}

考虑到我的列表无法包含该索引处的对象,我引入了内存泄漏。

处理此问题的最佳解决方案是什么?即使效率较低,我是否必须退回返回拷贝,或者在返回引用文献时我是否遗漏了什么?

最佳答案

你有多种选择:

  1. 使用 std::shared_ptr如果“Get”将对象的所有权传递给调用者。这样对象就不会超出范围。当然,调用者不知道它何时发生。
  2. 使用 std::weak_ptr .这与1.的含义相同,但可以重置ptr。在这种情况下,调用者可以检测对象是否已被删除。
  3. 使用std::optional按照评论中的建议,返回拷贝或引用。使用引用类型作为可选参数并不能避免对象被删除的问题,因此引用也可能变得无效。拷贝可以避免这种情况,但如前所述,它可能太贵了。

通读这些行,您似乎暗示调用者将在调用后立即使用指针,并且只使用有限的时间跨度。所以 1. 和 2. 是等价的,似乎符合您的需要。

参见 this introduction to smart pointers了解更多详情。

关于c++ - 引用类型返回函数 : how to return (optional) object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54235061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com