Ух, этот API уродливый.
Я предполагаю, что функция обещает, что указатель, который она «возвращает», владеет ресурсом, который должен быть удален вызывающей стороной так же, как это делает smart_ptr
, и что smart_ptr
может быть инициализирован с помощью произвольного указателя. Иначе и быть не может.
Вы можете просто захватить указатель, как и в случае отсутствия интеллектуальных указателей, а затем поместить его в интеллектуальный указатель.
T* ptr;
Foo(ptr);
smart_ptr<T> val(ptr);
Может случиться так, что интеллектуальный указатель уже чем-то владеет, и вы хотите передать это что-то функции, а затем заменить то, чем владеет интеллектуальный указатель. Это ... даже уродливее.
Я не знаю, перейдет ли функция во владение переданным вами ресурсом (обычно я этого не ожидал, но поскольку API такой уродливый, я не собираюсь клясться им). Это приводит к двум различным сценариям.
Если функция становится владельцем переданного вами ресурса, т.е. она заботится об удалении самого указателя, тип интеллектуального указателя должен быть таким, который может отказаться от владения ресурсом, например std::unique_ptr
с функцией-членом release()
. Примечательно, что std::shared_ptr
не может этого делать (учтите, что другие shared_ptr
также могут владеть им).
Итак, предполагая, что интеллектуальный указатель имеет такую возможность и возможность повторно инициализировать произвольный указатель (например, с std::unique_ptr::reset
), вы можете сделать следующее:
//smart_ptr<T> val;
T* ptr = val.release();
Foo(ptr);
val.reset(ptr);
Если функция не получает права владения ресурсом, все, что требуется, - это возможность повторной инициализации с произвольным указателем.
//smart_ptr<T> val;
T* ptr = val.get();
Foo(ptr);
val.reset(ptr);
person
R. Martinho Fernandes
schedule
23.07.2013
shared_ptr
? - person avakar   schedule 23.07.2013