У меня есть многопоточное приложение C ++, которое может вызывать из любого потока функцию, подобную следующей, чтобы получить объект из списка / вектора.
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
- это глобальный синглтон и т.д ...).
Проблема здесь в том, что если MyObject
по этому индексу удалено внутри GlobalClass
, в определенный момент я использую неверный указатель (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 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 ;
}
}
Учитывая, что мой список не может содержать объект по этому индексу, я ввел утечку памяти.
Как лучше всего с этим справиться?
Должен ли я вернуться к возвращению копии, даже если она менее эффективна, или что-то мне не хватает при возврате ссылки?