Лучший способ получить указатель на указатель содержащийся в shared_ptr

есть legacy функция:

void abc(char ** c);

и есть современный код вида:

std::shared_ptr<char> ptr;

каким образом можно наиболее идиоматично повторить такой вызов:

char* ptr = "asd";
abc(&ptr);

Ответы (1 шт):

Автор решения: Harry

Я тут давал ответ...
Но чем больше я о нем размышляю, тем больше нахожу подводных камней.

Поэтому я все же склоняюсь к тому, чтоб сказать - в общем случае - никак. Потому что указателем владеет shared_ptr, а вы хотите его у него отобрать полностью - а стандартного способа сделать это так, чтоб он не освободил память (если только он изначально не был создан таким, с неудаляющим удалителем) - я не вижу. И если abc освобождает память - все получается очень нехорошо.

Особенно нехорошо, что С++ работает через new, а старинный код, вероятно, через malloc, что формально тоже вносит свои неприятности.

Поэтому мое мнение - не использовать shared_ptr вместе с abc - пользуйте обычный указатель.


Поскольку уже пару человек поставили +, вроде неэтично удалять то, за что они это ставили... Так что старый ответ я оставляю, но считаю его не совсем верным - только разве если abc память по указателю не удаляет.

Пожалуй,

char* tmp = ptr.get();
abc(&tmp);
ptr.reset(tmp);

Но, imho, все равно такие фокусы чреваты неприятностями, надо очень внимательно смотреть/понимать 1. что делается в abc и 2. не может ли это как-то отразиться на остальных экземплярах shared_ptr...

Так что, пожалуй, более безопасно будет

char* tmp = ptr.get();
ptr.reset();
abc(&tmp);
ptr.reset(tmp);

А вообще, не стоит мешать французский с нижегородским и смешивать в одном коде два подхода.

P.S. Если кто-то считает, что лучше ответ удалить совсем - не стесняйтесь указать в комментариях; так и сделаю.

→ Ссылка