автоуказатели

Тема в разделе "LANGS.C", создана пользователем maksim_, 26 окт 2009.

  1. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    Я сам не люблю работать с автоуказателями и считаю, что нужно следовать концепции: кто выделяет ресурсы - тот их и освобождает. Насколько я знаю и в кернеле действует подобная концепция.
    Хочу услышать мнение других участников форума - за и против AutoPtr.
     
  2. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    а если эксепция как быть?
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    для Си используется такая концепция, в плюсах есть умные указатели и обычно такую модель не используют.
     
  4. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    одно дело, когда в одном месте объекты создаются и освобождаются, другое - когда по всей программе. если где-нибудь накосячил с авто птрами - ищи по всему проекту.
     
  5. nop_

    nop_ New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    61
    Покажи как будет выглядеть аналог вот этого:

    Код (Text):
    1. std::auto_ptr<resource> resource_factory::create();
    2.  
    3. //...
    4. std::auto_ptr<resource> r1 = factory.create();
    5. std::auto_ptr<resource> r2 = factory.create();
    без использования 'auto_ptr'. Уверяю тебя, мест потенциального 'накосячивания' в твоем коде будет больше, да и выразительность пострадает.
     
  6. reversecode

    reversecode Guest

    Публикаций:
    0
    я за умные указатели
    но токо использованы по умному

    например всякиее auto_ptr и прочая хрень мне не нравиться
    как впрочем и сам std мне не нравиться

    но это все дело вкуса
    кто знает как делать правильно - делает
    кто не знает
    - либо использует умные указатели
    -либо пишет проекты на 'C' миксе с кучей костылей и называет это проект на 'C++'
     
  7. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    я придерживаюсь другого подхода. пока не знаешь классов - их не используешь вообще и обосновываешь это всеми недостатками ооп. как только начинаешь работьать с классами, узнаёшь все удобства программирования на с++ - ничинаешь лепить эти классы куда не попадя. в итоге получается месево из классов чёрт знает как натыканных, налепленых друг на друга.
    так вот, по моему мнению, перед созданием нового класса стоит 100 раз подумать - нужен ли он как сущность, есть ли необходимость в его создании и т.д. иначе получится каша, в которой для того, чтобы внести элементарные изменения нужно, например, наследовать новый класс для перехвата методов и т.п.
    вобщем-то в этом мой вопрос и заключается. авто птры - особой сущности не имеют, они лишь упрощают работу с выделением, освобождением ресурсов, хотя, может я и ошибаюсь.
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    maksim_
    Указатель конечно ничего не выделяет. ^) Указатель как правило должен владеть объектом на который указывает(не всегда конечно). Безумные указатели чреваты багами и ещё раз багами, в какой-то ветке кода забыли уничтожить объект, где-то неожидали эксепшн. А так конечно std::auto_ptr довольно ограниченная и не слишком удобная вещь, лучше использовать boost::shared_ptr или написать свой велосипед.
     
  9. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Я использую умные указатели, а как надо правильно делать?
     
  10. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Рассмотрим классический ООП, где объекты обмениваются сообщениями. В С++ отправка сообщения симулируется вызовом функции-члена, сообщение передаётся как параметр и вместе с ним передаётся владение (семантика auto_ptr). Другими словами, концепция не универсальна, зачем ей следовать?
     
  11. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Самый простой пример фола. тред аллоцирует структуру, запускает другой тред и передает ему указатель на неё. Если не предавать владение, то первый тред ДОЛЖЕН ждать пока 2й завершится.
     
  12. reversecode

    reversecode Guest

    Публикаций:
    0
    а я не использую, и тоже нормально
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    лол, средства должны выбираться исходя из цели.
    Иногда удобно юзать плюсы, почти всегда лучше юзать в плюсах смарт поинтеры. Однако есть и исключения.
     
  14. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Погоди, по твоей классификации это попадает под "кто не знает - пишет проекты на 'C' миксе с кучей костылей и называет это проект на 'C++'".
     
  15. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Можно пример? если такой случай
    Код (Text):
    1. T*p = new T();
    2. // delete не требуется
    Код (Text):
    1. auto_ptr<T> ap( new T() );
    2. T*p = ap.release(); // код самодукументирован (delete не требуется) и комент не нужен
    то исключений нет :) во втором варианте больше писать и поэтому может он и хуже, но первый надо задокументировать что бы кто-то не дописал потом delete по ошибке.

    Другое исключение это невозможность хранить auto_ptr в конейнерах, но для этого есть другие смарпоинтеры.
     
  16. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    а почему второй тред не может аллокейтить структуру? я может чего-то не понимаю, но как помогут авто птры в данной ситуации? один фиг первому треду нужно дажидаться пока новый тред не добавит свою ссылку на объект. после этого, конечно, первый тред может завершиться. но в таком случае можно просто копировать структуры. первый тред создал, передал второму. второй при запуске скопировал всё что ему нужно. первый тред удалил структуру.
     
  17. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Потому что первый в этой структуре передаёт второму параметры )
    Не нужно, достаточно передать auto_ptr.
    Код (Text):
    1. struct params;
    2.  
    3. thread_routine(void*context) {
    4.   auto_ptr<params> p(static_cast<params>(context));
    5.   ...
    6. }
    7.  
    8.   // стартуем тред и передаем ему владение параметрами
    9.   auto_ptr<params> p( new params );
    10.   start_tread(thread_routine, p.release());
     
  18. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Этот случай я описывал как недостаток подхода "то первый тред ДОЛЖЕН ждать пока 2й завершится"
     
  19. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Жаль нет правки а то я б подправил выше на "ДОЛЖЕН ждать 2й тред" )))
     
  20. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Тема - типичный флуд.
    Нет конкретной проблемы - не будет конкретного решения.
    А что использовать каждый решает по вкусу - правильно/неправильно тут не применимо.
    Средства решения определяются задачей, а задачи конкретной нет.