Является ли дескриптор тем же, что и умный указатель? - PullRequest
5 голосов
/ 02 августа 2010

Я почти закончил Accelerated C ++ от Koenig & Moo, и в главах 13 и 14 они изложили идею и реализацию нескольких классов Handle (простых, общих, с подсчетом ссылок).

Классы заключены в капсулунеобработанный указатель и абстрагирование выделения / освобождения динамических объектов от клиентского кода, чтобы избежать всех опасностей необработанных указателей, а также позволяет пользователю разыменовывать их для доступа к указанному объекту.По сути, это «более безопасный» способ взаимодействия с необработанными ресурсами памяти.

Являются ли классы, представленные в этих главах, по существу реализациями интеллектуальных указателей?Умные указатели все еще довольно новы для меня, но насколько я понимаю, эти классы Handle выполняют одну и ту же функцию.

  1. Есть ли различие между ними или это просто другое название для той же вещи?
  2. Если предположить, что они эквивалентны по функциям, на практике такой класс, как этот, будет написан с нуля, а не с использованием уже созданного решения с использованием интеллектуальных указателей?

РЕДАКТИРОВАТЬ

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

Код впервый фрагмент кода здесь , 7.1, в значительной степени соответствует тому, что они имеют в главах, на которые я ссылаюсь.

Ответы [ 3 ]

6 голосов
/ 02 августа 2010

По вашему описанию это звучит как умный указатель.
Хотя лично я бы не использовал термин handle, так как он слегка двусмысленный (просто назову умный указатель умным указателем).

Q: МожетВы пишете умный указатель с нуля?
A: Да

Q: Если вы напишите свой умный указатель.
A: Нет. Это намного сложнее, чем вы думаете.Даже описание в книге только затушевывает более сложные проблемы.Придерживайтесь стандартных, предоставляемых авторитетными библиотеками.

Q: Обрабатывает, что это значит.
A: Раньше оно означало указатель на указатель.Но термин стал неоднозначным за эти годы, так как термин использовался повторно.Но вы можете считать это указателем на ресурс, к которому к ресурсу могут обращаться другие методы, и в этом контексте их описание является верным.

В: Если вы используете умные указатели вместо необработанной памяти.
A: Никогда не используйте RAW-память, за исключением случаев, когда это абсолютно необходимо (а это практически никогда не происходит), всегда инкапсулируйте ее в классе, который ей управляет.Является ли класс интеллектуальным указателем или объектом другого типа - хороший вопрос.std :: vector не считается умным указателем, но он инкапсулирует указатель RAW.

В: Если вы абстрагируете управление памятью от бизнес-логики:
A: Это хитро, и некоторые могут не согласиться.Но я бы сказал всегда.Класс должен сделать одну вещь.Дело либо в управлении ресурсами, либо в бизнес-логике.объединение двух приводит слишком непредвиденные сложности.

2 голосов
/ 02 августа 2010

Если вы простите немного метафорического C ++, отношения будут примерно такими: class smart_pointer : public handle;.Интеллектуальный указатель - это дескриптор, который обеспечивает определенный (подобный указателю) стиль интерфейса между дескриптором и чем бы то ни было, с которым он работает.Дескриптор, который не является интеллектуальным указателем, обычно имеет (по крайней мере, неопределенно) похожие операции, но их интерфейс может быть совершенно другим.

В какой-то момент кто-то, очевидно, должен написать класс (ы) интеллектуального указателя.В то же время, это не то, что нужно предпринимать легко.Если у вас нет чрезвычайно точной спецификации, вы, вероятно, ошибетесь хотя бы в нескольких деталях - и эта "чрезвычайно точная спецификация" только уменьшает шансы примерно до 50:50 ...

OTOH, это все еще не так плохо, как разработка умного указателя.Это, как правило, сложно в крайности.В качестве очевидного примера, auto_ptr был разработан и перепроектирован несколько раз во время стандартизации, но он все еще видит относительно небольшое применение в реальной жизни и уже устарел в C ++ 0x (заменен на std::unique_ptr, которыйявляется продуктом лота работы, дебатов и немалых экспериментов и испытаний).

1 голос
/ 02 августа 2010

Я бы сказал, что дескриптор является более общей концепцией, чем умный указатель.

Рассмотрим, например, дескрипторы файлов. Дескриптор файла может фактически быть умным указателем на структуру данных, представляющую открытый файл, но клиент на самом деле не рассматривает его как указатель, а просто передает дескриптор API.

Итак, да, я несколько раз писал свои собственные классы дескрипторов.

...