Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Скрестить фабрику объектов и умные указатели |
Автор: BasMan 11.3.2009, 21:48 | ||||||||
Еще не сильно в шаблоны углубился, есть такой код:
Как сюды можно прикрутить умные указатели? В частности auto_ptr? Фабрика создается:
затем регистрируем на ней класс
соответственно такое извращение не прокатит ![]()
Основной вопрос, каким образом вместо базового класса объектов фабрики (clsExecutorInterface*) подсунуть std::auto_ptr<clsExecutorInterface>, все мозги сломал уже ![]() Заранее спасибо. |
Автор: vinter 11.3.2009, 22:12 |
сотри его, и перепиши с нуля |
Автор: BasMan 12.3.2009, 12:42 |
А если сделать еще один класс, который будет "контейнером" для clsExecutorInterface, и будет заниматься подсчетом количества ссылок и автоубиением экземпляра clsExecutorInterface? Помоему было бы неплохо. p.s. У меня наследники clsExecutorInterface подгружаются из so библиотек, все вроде бы работает, но надоело постоянно приглядывать за указателями, а если проект будет разрастаться, то думаю будут неизбежны утечки памяти. |
Автор: azesmcar 12.3.2009, 13:42 | ||||||||||||
auto_ptr это не умный указатель. Умный указатель ведет подсчет ссылок, auto_ptr - нет.
как некрасиво ![]()
этот каст ну ни к чему...
а это зачем нужно? вообще код ужасно надуманный и нечитабельный... функция возвращяет void * притом что у тебя класс инстанцирован типом который тебе нужно вернуть, и вообще зачем этот класс? И даже не один а два..
что это??? почему не так
если тебе нужен auto_ptr - то пусть функция Create возвращает сразу auto_ptr..только не забывай в классе деструктор виртуальным сделать. А то auto_ptr его удалит по базовому указателю будет тебе memory leak. |
Автор: azesmcar 12.3.2009, 14:00 | ||
вот так хорошо? |
Автор: Fazil6 12.3.2009, 16:14 | ||
дальше не читал. сразу фтопку... |
Автор: BasMan 12.3.2009, 16:24 |
Fazil6, глазами прочесть "в топку", а совершить кучу действий чтобы оставить пустой пост таки нужно было ;) azesmcar спасибо, сегодня вечером попробую. Код кстати не мой, не помню где нашел, просто в основном то все понятно с шаблонами, и простые реализация сам могу написать, а такое чтобы и фабрика и умные указатели сразу в одном, пока сложновато. |
Автор: azesmcar 12.3.2009, 16:37 |
BasMan, ну твой, не твой..а на минусы его указать стоит ![]() удачи |
Автор: jonie 13.3.2009, 09:12 | ||
|
Автор: azesmcar 13.3.2009, 09:30 | ||||
ну в принципе это термин, спорить тут бессмысленно. Я посмотрел, действительно для Smart Pointer ничего не сказано что он должен вести подсчет ссылок. Наверное откуда-то засело в памяти. Но это по моему не так актуально, называть его можно как угодно. В конце концов Элджер в своей книге вообще разделил на глупые, умные, мудрые и гениальные указатели. Добавлено через 2 минуты и 5 секунд
вообще это красивое решение возвращять из фабрики умный указатель. |
Автор: BasMan 14.3.2009, 10:55 | ||||||
Время наконец то выдалось, проблема в следующем, компилятор (gcc 3.4.2) на данный код:
ругается:
Как я понял он не видит objectCreator, причем CodeBlocks видит objectCreator, например в теле factory начинаешь набирать factory:: он вываливает список содержимого factory в т.ч. и objectCreator. Если вынести из класса и объявить возвращаемый тип как void*:
то все успешно компиляется |
Автор: azesmcar 14.3.2009, 16:32 | ||
Добавь typename перед обявлением итератора..я забыл |
Автор: BasMan 14.3.2009, 17:01 | ||
Итоговый вариант ![]()
Все вроде бы работает ![]() Большое спасибо, а код думаю еще кому-нибудь будет полезен. p.s. Решил не поскупиться, заказал бумажный вариант книг Страуструпа и Александреску. |
Автор: azesmcar 14.3.2009, 17:04 | ||
Сатера не забудь ![]() |
Автор: zim22 14.3.2009, 17:06 | ||
![]()
кому? azesmcar'у за помощь? |
Автор: Леопольд 19.7.2009, 12:06 | ||
Перед Александреску рекомендую прочесть "Шаблоны С++. Справочник разработчика". Я прочитал примерно 100 стр. из книги Алесандреску, прежде чем стал читать эту. Дочитаю, буду читать Алесандреску заново. А Стауструпа я читал почти год, пришлось прочесть дважды, и всё равно, с локали + фасеты не разобрался, лень было... ![]() |
Автор: zim22 19.7.2009, 12:08 |
![]() там 1000 страниц. если в день по 10 стр. читать - то за 3 месяца можно осилить ![]() |
Автор: Леопольд 19.7.2009, 19:18 |
Ну, я прочёл его дважды, и чуть меньше чем за год. Месяцев 10 примерно. Значит я читал, в среднем, менее чем по 10 страниц в день. Мне он дался тяжело. Может потому что я не просто читал, а ещё пытался всё понять, запомнить, и поначалу решал все задачи... Остановился на задаче - выучить ещё один иностранный язык ![]() |
Автор: BasMan 14.9.2009, 12:21 |
В догонку теме, суть, в приложении размещается фабрика, в разделяемые библы передается указатель на хост-объект приложения, через который уже дллка получает smart_ptr на фабрику и выполняет регистрацию классов на фабрике. Объекты создаваемые на фабрике будут использоваться только в приложении. Если я все верно понимаю, шаблоны будут инстанцироваться в библах, затем созданные объекты друг другу будут будут передавать умные указатели и работать с объектами приложения. Что будет с выделением/освобождением памяти (косяков не будет? (в частности подобных передаче std::string в функции библиотек)) Небольшое уточнение, шаблон фабрики располагается в файле .h интерфейса приложения, этот файл используется в приложении и разделяемых библиотеках. Поэтому указатели/умные указатели свободно проходят в библу и обратно. Да и по сути, в библу только один раз передается указатель хост-объекта приложения, все дальнейшие действия выполняются уже в классах. |
Автор: BasMan 4.10.2009, 07:25 |
Прогнал приложение с одним тестовым плагином (в нем два функтора, один выполняется в том же потоке что и вызвавший его код, второй в новом потоке, оба принимают объект-контейнер различных типов (класс обертка вокруг boost::any)), так вот, валгринд не показывает ни утечек памяти, ни двойного особождения памяти, выходит что "моя архитектура" (### ![]() |
Автор: BasMan 5.10.2009, 05:42 | ||||
Сорри если все таки отклоняюсь от темы, но напрямую касается умных указателей. Почти час искал баг, в какой-то момент приложение падало, причем именно при тестировании функтора который создавал новый поток для исполнения. Нашел баг. Часть кода объекта функтора.
Код который его вызывает (обработка шла в цикле без пауз)
Создается умный указатель, объекту передаются параметры, выполняется создание потока pthread, в качестве аргумента функция exec_proc (статическая функция) (функция выполняется в созданном потоке) и указатель на текущий объект-функтора, затем используя указатель делаем вызов не-статической функции process и нам снова доступны все нестатические элементы класса но уже из нового потока. А ошибка была в том, что пока инициализировался новый поток цикл продолжал свою работу и убивал объект functor, в итоге thisobj становился невалидным и все рушилось. |