Я пытаюсь «модернизировать» какой-то существующий код.
- У меня есть класс, который в настоящее время имеет переменную-член «Device * device_».
- Он использует new для создания экземпляра в некотором коде инициализации и имеет "delete device_" в деструкторе.
- Функции-члены этого класса вызывают многие другие функции, которые принимают Device * в качестве параметра.
Это работает хорошо, но, чтобы «модернизировать» мой код, я подумал, что мне следует изменить переменную, определив ее как "std::unique_ptr<Device> device_"
, и удалить явный вызов удаления, что делает код более безопасным и в целом лучше.
У меня такой вопрос -
- Как мне затем передать переменную device _ всем функциям, которым она нужна в качестве параметра?
Я могу вызвать .get, чтобы получить необработанный указатель при каждом вызове функции. Но это кажется уродливым и в первую очередь лишает смысла некоторые причины использовать unique_ptr.
Или я могу изменить каждую функцию так, чтобы вместо параметра типа «Устройство *» теперь принимался параметр типа «std :: unique_ptr &». Что (для меня) несколько запутывает прототипы функций и затрудняет их чтение.
Что для этого лучше всего? Пропустил ли я какие-то другие варианты?
unique_ptr
заключается в том, что вам не нужно окружать указатель блоком try, чтобы гарантировать его удаление в случае исключения. Это означает, что объект с деструктором не принесет вам много пользы, если у вас нет особых ограничений в конструкторе. (Независимо от того, помещаете ли вы удаление в деструктор или используетеunique_ptr
, получается примерно одно и то же с точки зрения того, что вы должны помнить.) - person James Kanze   schedule 14.03.2012std::unique_ptr
позволит избежать утечки памяти самым простым способом. Это не единственный способ, но он прост и рассчитан на будущее (т. Е. Более поздние модификации конструктора не будут подвержены риску утечки). В худшем случае это должно быть не хуже ручного подхода. Почему вы говорите, что в этом случае [может быть] обратное? - person David Rodríguez - dribeas   schedule 14.03.2012std::unique_ptr
помогло бы решить. Это просто добавило сложности и запутывания. В более сложных ситуациях это зависит. В большинстве случаев более чистым решением было бы делегирование базовому классу, который отвечает только за один объект - за этот объект. (Очень хороший пример этого - реализацияstd::vector
в g ++.) В других случаях имеет смысл иметь членunique_ptr
, но, по моему опыту, они не очень распространены. - person James Kanze   schedule 14.03.2012