Извлечение необработанного указателя из shared_ptr

Можно ли извлечь необработанный указатель из объекта std::shared_ptr или std::tr1::shared_ptr? Цель состоит в том, чтобы сообщить объекту интеллектуального указателя, что я больше не хочу, чтобы он управлял временем жизни объекта. Контекст состоит в том, что у меня есть API, который принимает исходный указатель от пользователей и выполняет некоторую обработку объекта. Чтобы упростить управление, API создает shared_ptr из этого необработанного указателя. Теперь пользователь может попросить вернуть объект. В этом случае, возвращая обработанный объект пользователю, я хочу вернуть необработанный указатель. Однако я не нашел способа сделать это. Использование .get() невозможно, так как в этом случае интеллектуальный указатель должен будет оставаться в рабочем состоянии бесконечно. Я бы отдал unique_ptr, но он недоступен в tr1.

В основном я хочу переместить необработанный указатель из shared_ptr.


person 341008    schedule 09.04.2014    source источник
comment
Не могли бы вы сделать пример с кодом? Я не совсем понимаю, зачем вам возвращать указатель на пользователя.   -  person Shoe    schedule 09.04.2014
comment
Указатель на класс, который вы контролируете, или производный от класса, который вы контролируете?   -  person aschepler    schedule 09.04.2014
comment
@Jefffrey, к сожалению, образец кода был бы слишком сложным. Понимая, как сложно это объяснить, я начинаю думать, что мне нужно изменить свой дизайн :)   -  person 341008    schedule 09.04.2014
comment
@ 341008, да, похоже, стоит. :)   -  person Shoe    schedule 09.04.2014


Ответы (1)


Я думаю, вы ищете метод release() из shared_ptr. Извините - такого способа нет по задумке.

Здесь я нашел забавный способ делать то, что вы хотите - https://stackoverflow.com/a/13701773/233885.

Вам следует снова подумать об использовании shared_ptr в вашем контексте (владение).

person Marco Schmidt    schedule 09.04.2014
comment
Ага, искал release() метод. Ответ, предложенный в этом посте, вероятно, слишком рискован для такого неспециалиста, как я. Я не хочу, чтобы мне приходилось выискивать в этом баги :). Думаю, мне придется переосмыслить свой дизайн. Спасибо, в любом случае. - person 341008; 09.04.2014