Рассмотрима кодаunique_ptr использования для старых функций
struct Resource
{
Resource()
{
std::cout << "C";
}
~Resource()
{
std::cout << "D";
}
};
void allocate(Resource **p)
{
*p = new Resource();
}
int main()
{
Resource *p = nullptr;
allocate(&p);
std::unique_ptr<Resource> uptr(p);
//stuff
}
Предполагая, что «выделить» функция широко используется в унаследованном коде в нескольких местах вызова, основная функция показывает попытку использовать unique_ptr управлять выделенным ресурсом. Проблема возникает, когда другой программист в команде пишет код, подверженный ошибкам, после «allocate» и до того, как «unique_ptr» получит его.
Таким образом, одно решение, которое приходит на ум, чтобы написать код, который использует оператор запятой следующим
std::unique_ptr<Resource> up((allocate(&p), p));
Есть еще один разумный способ справиться с этой ситуацией? Основная проблема состоит в том, чтобы сделать alllocation и владение в качестве атомной операции.
В этом конкретном случае у вас может быть функция, которая просто возвращает указатель: 'Resource * allocate() {Resource * result; выделяют (& результат); результат возврата; } ', а затем используйте эту функцию:' std :: unique_ptr up (allocate()); 'Ваша настоящая проблема более общая, и если да, можете ли вы изменить свой вопрос, чтобы включить случаи, которые не могут быть решены так? –
hvd
как обматывать функцию 'allocate' так, чтобы она вернула перемещенный' std :: unique_ptr'? – Alex
Как я уже упоминал, allocate - это сильно используемая функция, и я не вижу ее подписи сразу. Итак, в том смысле, что это медленное, но устойчивое принятие концепций C++ 11 в продукте – Chubsdad