Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > auto_ptr


Автор: newbie2 12.6.2007, 17:24
Немного не понятно...
В силу ограничений auto_ptr, возникает вопрос...
Какое практическое применение имеет auto_ptr? Кроме возвращения указателя из функции?
Приведите пожалуйста примеры.
В остальных случаях можно ведь обойтись и обычными локальными переменными?

Автор: Daevaorn 12.6.2007, 17:31
Цитата(newbie2 @  12.6.2007,  18:24 Найти цитируемый пост)
Какое практическое применение имеет auto_ptr?

для реализации RAII, конечно с учетом ограничений.
Цитата(newbie2 @  12.6.2007,  18:24 Найти цитируемый пост)
 Кроме возвращения указателя из функции?

Цитата(newbie2 @  12.6.2007,  18:24 Найти цитируемый пост)
В остальных случаях можно ведь обойтись и обычными локальными переменными?

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

Автор: newbie2 12.6.2007, 18:28
Цитата(Daevaorn @  12.6.2007,  17:31 Найти цитируемый пост)
в том то и дело, что нужно не обходиться, а избегать голых указателей совсем, где это возможно.

Нет, я имел в виду следующее:
1) в случае функции имел в виду возвращение auto_ptr, а не голого указателя
2) в случае локальных переменных имел в виду следующее:
вместо использования auto_ptr вполне можно обойтись использованием обычных локальных объектов, т.к. они выделяются в статической памяти и в случае exceptions деструкторы сработают.

То есть, как я понял, их применение только в возвращении с функций (и то, можно обойтись без auto_ptr), и для реализации RAII в конструкторах? И всё?.. Больше нигде не применяется?

Автор: Daevaorn 12.6.2007, 19:01
Цитата(newbie2 @  12.6.2007,  19:28 Найти цитируемый пост)
вместо использования auto_ptr вполне можно обойтись использованием обычных локальных объектов, т.к. они выделяются в статической памяти и в случае exceptions деструкторы сработают.

нет. обойтись то можно чем угодно. просто если есть необходисомть в диначмическом создании и контроле времени жизни объекта, то auto_ptr приходит на помощь. А лучше сразу брать умные указатели из boost. 
Цитата(newbie2 @  12.6.2007,  19:28 Найти цитируемый пост)
То есть, как я понял, их применение только в возвращении с функций (и то, можно обойтись без auto_ptr), и для реализации RAII в конструкторах? И всё?.. Больше нигде не применяется?

из-за особенностей реализации.

Автор: Ulysses4j 12.6.2007, 19:03
auto_ptr появился в ответ на печальную статистику: большая часть ошибок в промышленном коде - это утечки памяти. Если вы можете обходиться без работы с динамической памятью - ваше счастье, обходитесь. Большие программы, которые стоят денег (в частности, enterprise не для публичного пользования) чаще всего не могут, это объективная реальность.

Автор: newbie2 12.6.2007, 19:40
Понятно, спасибо за ответы.
Применение умных указателей из boost я могу понять (хотя и не изучал их пока), у них возможностей больше.
Просто я, чтобы не создавать утечку памяти, использую vector, basic_string и т.п. вместо их низкоуровневых аналогов, работающих с динамической памятью... и пока что мне сложно представить ситуацию, когда не обойтись без динамического создания объектов, но можно воспользоваться auto_ptr... Было бы хорошо, если приведёте пример (можно схематично).
Единственное исключение - RAII - тут, похоже, действительно auto_ptr незаменимы...

Автор: Ulysses4j 12.6.2007, 20:22
Ой, а можно отправить к классикам...

Мейерс. Наиболее эффективное использование С++. Приложение 2. Реализация шаблона auto_ptr (начинается словами: "В правилах 9,10, 26, 31 и 32 упоминается исключительная полезность шаблона auto_ptr".)

Джосаттис. Глава 4. Пункт: "Подробное описание класса auto_ptr".

Можно еще поискать. Упомянутые книжки есть в сети. 

На самом деле сильно глубоко разбираться с auto_ptr я смысла не вижу - это одна из первых реализаций умных указателей, которая получила признание, достаточное для включения в Стандарт. Реализация не самая удачная, как показала последующая история. Сегодня имеет смысл сразу разбираться с с тем, что есть в boost, а не ворошить прошлое.

Автор: archimed7592 12.6.2007, 22:44
Цитата(Ulysses4j @  12.6.2007,  20:22 Найти цитируемый пост)
Реализация не самая удачная, как показала последующая история.
Именно поэтому, новый стандарт объявит auto_ptr устаревшим(deprecated) и введёт unique_ptr который будет в большей степени отвечать семантике перемещения, чем его предшественник auto_ptr.

Автор: newbie2 14.6.2007, 09:40
Спасибо за исчерпывающий ответ

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)