![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 0 Всего: 13 |
О чём думали дизайнеры STL, создавая в нём единственный тип смартпоинтеров, который при том (что он единственный) нельзя использовать в контейнерах?
Мне нужен полиморфизм для объектов в коллекции (например, в векторе). Просвятите неразумного шарписта, как в C++ (без всяких бустов и нового Стандарта) это сделать? Не указатели же на базовый класс хранить?
-------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 0 Всего: 13 |
В идеале я бы хотел вот такого, но из стандартной поставки:
-------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
И в любом случае в Base нужно определить виртуальный деструктор
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 0 Всего: 13 |
Виртуальный деструктор тут нафик не нужен. Добавлено через 2 минуты и 7 секунд Как нет. А auto_ptr?
Вопрос в том, как люди обходятся? Пишут своё? Почему нет в стандартной библиотеке ничего подходящего? -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
rgsoftware |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 7.6.2005 Репутация: нет Всего: 2 |
Ну, потому что Стандартная библиотека в нынешнем виде -- это фиксация на бумаге 1998 года, тогда ещё народ, видимо, коллективно не созрел до смартпоинтеров в коллекциях. А потом дописали буст... Если по каким-то причинам буст не устраивает, надо просто вырезать кусок, ответственный за shared_ptr, и использовать у себя с чистой совестью ![]() |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
имелось ввиду тех, о которых ты спрашивал. Про auto_ptr ты сам написал, и сам же сказал почему он не подходит.
нет, почему же..люди уже давно используют буст ![]() boost смело можно считать стандартной библиотекой. STL писали давно, в нее много чего не вошло. он определится автоматически как виртуальный, так как деструктор базового класса виртуальный. Добавлено через 13 минут и 13 секунд подожди, чего-то не так понял (я думал речь о наследниках)..так он же виртуальный. Это сообщение отредактировал(а) azesmcar - 18.3.2010, 08:46 |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Ты в этом уверен на 100%? Потому что обычно, когда есть виртуальные методы, виртуальный деструктор нужен. Другими словами, если потомки класса Base имеют хоть один атрибут, то без виртуального диструктора твой первый пример приведет к утечкам памяти.
Напиши свой вариант shared_ptr внутри #ifdef/#else/#endif, что позволит использовать твой код юзая смартпоинтеры нового стандарта лишь задефайнив определенный макрос. |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Мне пора в отпуск..
я функцию Do за деструктор принял ![]() наконец понял о чем речь. можно сказать он нужен всегда (когда есть виртуальные методы), а тут тем более, иначе в строке
будет UB. gcc даже warning выдает на классы, у которых есть виртуальные методы и не виртуальный деструктор. Это сообщение отредактировал(а) azesmcar - 18.3.2010, 11:36 |
||||
|
|||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Сишарперы настолько суровы, что не в состоянии прикрутить к своему проекту любой готовый sharedptr, не говоря уже о том, что бы написать его самому за десять минут? Нет его в STL, сами написали, так чего сопли по форумам размазывать?
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 0 Всего: 13 |
Уверен. Что за атрибут? Где тут утечка? -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
имелся ввиду любой атрибут класса, которого в примере нет, но в реальной жизни может и быть. скорее всего это утечка, так как не вызовется деструктор наследника, но стандарт не гарантирует определенного поведения, при удалении объекта класса, не имеющего виртуального деструктора через указатель базового. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Если мы рассматриваем конкретно тот пример, который иллюстрирует проблему, а в реальной программе у тебя есть виртуальный деструктор, то нет проблем. Считай, это напоминание.
|
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
Как тут уже сказали, есть буст и (когда-нибудь "релизнется" же он
![]() |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
||||
|
||||
NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 0 Всего: 13 |
Ну так деструктор вызываться должен для того, чтобы что-то в классе удалить/почистить/закрыть/etc., а у меня же класс пустой. -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Повторяю еще раз, утечка памяти это частный случай реализации.
|
||||
|
|||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
а Child1::vf_ptr ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
![]() Спасибо за ссылку, но это ещё ничего не значит. Изначально его планировали релизнуть до 2009, и сейчас у них тоже только планы ![]() |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
-------------------- вопросов больше чем ответов |
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
![]() так что ли?
так он и этого тоже не позволит
может речь идет о защищенном наследовании? В таком случае совсем непонятно зачем там нужен полиморфизм. Это сообщение отредактировал(а) azesmcar - 19.3.2010, 15:38 |
||||||
|
|||||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Добавлено @ 15:45 Конечно не позволит. Подразумевалось что базовый класс абстрактный. Добавлено @ 15:47 Мне удобнее считать абстракный класс интерфейсом. В C# именно так и сделано, насколько я знаю. Добавлено через 13 минут и 4 секунды Нет, так:
Это сообщение отредактировал(а) Леопольд - 19.3.2010, 15:48 -------------------- вопросов больше чем ответов |
||||
|
|||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
понял что ты имеешь ввиду, вовсе не обязательно чтобы он был абстрактным, можно например так
не совсем так, на самом деле интерфейс - это класс, который описывает только интерфейс, который нужно реализовать, т.е. имеет одни только чисто виртуальные функции. Это сообщение отредактировал(а) azesmcar - 19.3.2010, 15:58 |
||||
|
|||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
![]() -------------------- вопросов больше чем ответов |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Как правило. Делать одну функцию чистой а остальные обычными я бы не стал. Даже если во многих наследниках придётся писать заглушки... Хотя, если функций больше 10 и нет возможности провести рефакторинг... -------------------- вопросов больше чем ответов |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Тогда я не понял что ты имел ввиду. Разверни, будь добр...
Добавлено @ 16:05 По моему надо стараться избегать помещать данные и не чистые функции в абстрактные классы. По крайней мере мне лично, так проще... Это сообщение отредактировал(а) Леопольд - 19.3.2010, 16:06 -------------------- вопросов больше чем ответов |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
-------------------- вопросов больше чем ответов |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
std::unary_function, std::binary_function ...
|
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Точно, это и есть претенденты на protected деструкторы...
![]() Добавлено через 1 минуту и 19 секунд Ты меня понял быстрее чем я тебя... ![]() -------------------- вопросов больше чем ответов |
|||
|
||||
NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 0 Всего: 13 |
Ну так, если он всё-таки будет пуст, виртуальный деструктор не нужен? -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 0 Всего: 13 |
Дело не в экономии. Дело в понимании. Мне вот совершенно непонятно, почему в моём коде нужен виртуальный деструктор. А люди, вместо того, чтобы сказать, что в этом коде он нужен или не нужен, додумывают к коду какие-то дополнения.... мол, а вот если бы так да эдак, то точно нужен бы был. -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
Тебе совершенно понятно объяснили, что в твоём случае имеет место быть UB и данных, которые ты предоставил недостаточно. Чтобы сказать будет или нет утечка можешь засунуть релиз в дизассемблер и посмотреть, что нагенерил компилятор. Или написать ключевое слово virtual и жить спокойно. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
сделай
а потом добавь
и повтори то же самое -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 0 Всего: 13 |
-------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
![]() ![]() по идее у тебя в первом случае (без виртуального деструктора) должна была закончиться память. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |