Я сам не люблю работать с автоуказателями и считаю, что нужно следовать концепции: кто выделяет ресурсы - тот их и освобождает. Насколько я знаю и в кернеле действует подобная концепция. Хочу услышать мнение других участников форума - за и против AutoPtr.
для Си используется такая концепция, в плюсах есть умные указатели и обычно такую модель не используют.
одно дело, когда в одном месте объекты создаются и освобождаются, другое - когда по всей программе. если где-нибудь накосячил с авто птрами - ищи по всему проекту.
Покажи как будет выглядеть аналог вот этого: Код (Text): std::auto_ptr<resource> resource_factory::create(); //... std::auto_ptr<resource> r1 = factory.create(); std::auto_ptr<resource> r2 = factory.create(); без использования 'auto_ptr'. Уверяю тебя, мест потенциального 'накосячивания' в твоем коде будет больше, да и выразительность пострадает.
я за умные указатели но токо использованы по умному например всякиее auto_ptr и прочая хрень мне не нравиться как впрочем и сам std мне не нравиться но это все дело вкуса кто знает как делать правильно - делает кто не знает - либо использует умные указатели -либо пишет проекты на 'C' миксе с кучей костылей и называет это проект на 'C++'
я придерживаюсь другого подхода. пока не знаешь классов - их не используешь вообще и обосновываешь это всеми недостатками ооп. как только начинаешь работьать с классами, узнаёшь все удобства программирования на с++ - ничинаешь лепить эти классы куда не попадя. в итоге получается месево из классов чёрт знает как натыканных, налепленых друг на друга. так вот, по моему мнению, перед созданием нового класса стоит 100 раз подумать - нужен ли он как сущность, есть ли необходимость в его создании и т.д. иначе получится каша, в которой для того, чтобы внести элементарные изменения нужно, например, наследовать новый класс для перехвата методов и т.п. вобщем-то в этом мой вопрос и заключается. авто птры - особой сущности не имеют, они лишь упрощают работу с выделением, освобождением ресурсов, хотя, может я и ошибаюсь.
maksim_ Указатель конечно ничего не выделяет. ^) Указатель как правило должен владеть объектом на который указывает(не всегда конечно). Безумные указатели чреваты багами и ещё раз багами, в какой-то ветке кода забыли уничтожить объект, где-то неожидали эксепшн. А так конечно std::auto_ptr довольно ограниченная и не слишком удобная вещь, лучше использовать boost::shared_ptr или написать свой велосипед.
Рассмотрим классический ООП, где объекты обмениваются сообщениями. В С++ отправка сообщения симулируется вызовом функции-члена, сообщение передаётся как параметр и вместе с ним передаётся владение (семантика auto_ptr). Другими словами, концепция не универсальна, зачем ей следовать?
Самый простой пример фола. тред аллоцирует структуру, запускает другой тред и передает ему указатель на неё. Если не предавать владение, то первый тред ДОЛЖЕН ждать пока 2й завершится.
лол, средства должны выбираться исходя из цели. Иногда удобно юзать плюсы, почти всегда лучше юзать в плюсах смарт поинтеры. Однако есть и исключения.
Погоди, по твоей классификации это попадает под "кто не знает - пишет проекты на 'C' миксе с кучей костылей и называет это проект на 'C++'".
Можно пример? если такой случай Код (Text): T*p = new T(); // delete не требуется Код (Text): auto_ptr<T> ap( new T() ); T*p = ap.release(); // код самодукументирован (delete не требуется) и комент не нужен то исключений нет во втором варианте больше писать и поэтому может он и хуже, но первый надо задокументировать что бы кто-то не дописал потом delete по ошибке. Другое исключение это невозможность хранить auto_ptr в конейнерах, но для этого есть другие смарпоинтеры.
а почему второй тред не может аллокейтить структуру? я может чего-то не понимаю, но как помогут авто птры в данной ситуации? один фиг первому треду нужно дажидаться пока новый тред не добавит свою ссылку на объект. после этого, конечно, первый тред может завершиться. но в таком случае можно просто копировать структуры. первый тред создал, передал второму. второй при запуске скопировал всё что ему нужно. первый тред удалил структуру.
Потому что первый в этой структуре передаёт второму параметры ) Не нужно, достаточно передать auto_ptr. Код (Text): struct params; thread_routine(void*context) { auto_ptr<params> p(static_cast<params>(context)); ... } // стартуем тред и передаем ему владение параметрами auto_ptr<params> p( new params ); start_tread(thread_routine, p.release());
Тема - типичный флуд. Нет конкретной проблемы - не будет конкретного решения. А что использовать каждый решает по вкусу - правильно/неправильно тут не применимо. Средства решения определяются задачей, а задачи конкретной нет.