![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Добрый вечер,
Есть такая проблема. Реализую PIMPL с использованием умных указателей. Код: x.h
x.cpp
ximpl.h
все нормально, все работает как и положено, но как только я реализую конструктор класса X в заголовочном файле (x.h) VS2010 начинает выдавать warning, что std::auto_ptr мол деструктора не видит (хотя он есть). gcc молчит, все в порядке..опять в микрософт что-то намудрили или так и положено? С решением все просто - отказаться от использования std::auto_ptr и удалять в деструкторе самому, но зачем? Это сообщение отредактировал(а) azesmcar - 22.1.2011, 22:46 |
||||||
|
|||||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 6 Всего: 10 |
azesmcar, auto_ptr не умный, а очень даже глупый указатель
разве shared_ptr не включили в новый стандарт? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 6 Всего: 10 |
на rsdn'e четко рассказано в чем соль
http://www.rsdn.ru/article/cpp/smartptr.xml#EMD в немногих случаях, когда я видел применение auto_ptr это было связано с глюками, которых не было бы без его применения, а в vs для wince я помню он вообще не был полностью реализован а shared_ptr уже в std::tr1, так что скоро будет в стандарте Это сообщение отредактировал(а) alexvs11 - 22.1.2011, 23:04 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
auto_ptr должен видеть деструктор того класса..
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Я знаю, деструктор есть. На работоспособность программы влияет не наличие деструктора, а реализация конструктора в заголовочном файле. Каким образом это связано? auto_ptr должен удаляться в деструкторе класса X, деструктор реализован в cpp файле (x.cpp), где реализация XImpl уже видна. соль чего? auto_ptr? я с ним знаком и он меня более чем устраивает для текущей задачи. скоро, не скоро..не все компиляторы его на сегодняшний день поддерживают. И кстати shared_ptr не замена auto_ptr, они для разных целей служат. Это сообщение отредактировал(а) azesmcar - 22.1.2011, 23:09 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
нет... деструктор auto_ptr формируется в месте инстантирования тьфу использования.. и там должен быть виден нужный деструктор .. Это сообщение отредактировал(а) mes - 23.1.2011, 00:00 |
|||
|
||||
| azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
формируется - да, но не вызывается. а вызывается он уже там, где реализация видна. код в первом посте нормально компилируется и работает, вопрос в том, что он перестает работать (точнее просто выдает warning) как только я пишу конструктор в заголовочном файле. А я не могу его писать в файле реализации, он шаблонный. Добавлено через 5 минут и 16 секунд
и о чем это говорит? Добавлено через 6 минут и 23 секунды mes http://www.gotw.ca/publications/mill12.htm
Это сообщение отредактировал(а) azesmcar - 22.1.2011, 23:15 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
тут говориться то, о чем пишу я и нет ответа на мой вопрос Добавлено через 22 секунды |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
перечитал еще раз.. понял о чем речь.. да я как то криво читал, сорри.. сейчас обдумаю
Добавлено через 5 минут и 18 секунд мм.. а деструктор шаблона тоже в хидере ? |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
вот именно что нет, только конструктор..деструктор то я могу перенести в реализацию. Исходник точно такой, как в первом посте (только конструктор шаблонный). Для получения ошибки достаточно заменить в коде из первого поста
на
и убрать реализацию из cpp файла. ну в общем-то как я уже писал решение есть и довольно простое, делать new, delete самому, но хотелось бы разобраться. Это сообщение отредактировал(а) azesmcar - 22.1.2011, 23:30 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
полагаю VS формирует _pre-destructor_ там, где формируется конструктор..
Это сообщение отредактировал(а) mes - 23.1.2011, 00:02 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
упс...забыл проинициализировать
ложная тревога Добавлено @ 08:37
проверил, в деструкторе к impl можно спокойно обращаться, т.е. удаляется объект после выхода из тела деструктора в файле реализации. Почему в таком случае студия хочет деструктора там, где он ей не нужен? в итоге получается вот это. работает, но деструктор XImpl не вызывается. x.h
ximpl.h
x.cpp
Это сообщение отредактировал(а) azesmcar - 23.1.2011, 08:44 |
||||||||
|
|||||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну так и должно оно быть
наверно слово pre_destructor неправильно подобрал.. имелась ввиду такая условная схема:
|
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
такая схема или место формирования деструктора ? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
насчет схемы отсюда можно сделать вывод :
а когда формировать эту часть деструктора, в стандарте вроде не сказано .. |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
ну это естественно. т.е. именно деструктор должен вызывать, деструкторы для базового классов и членов. тогда это не соответствует стандарту (если это конечно работает именно так) |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Возможно он ей нужен, что бы сгенерить код поддержки исключений, для раскрутки стека в возможном исключении после вызова конструктора std::auto_ptr<XImpl> (хотя его там и нет Т.е. то, что она (студия) сгенерила деструктор auto_ptr в конструкторе X::X(), еще не значит, что она его когда либо вообще позовет Это сообщение отредактировал(а) xvr - 24.1.2011, 14:58 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Вы описали поведение деструктора вот так
т.е. он формирует пре-деструктор (назовем его так) там, где определен конструктор. По стандарту
т.е. именно деструктор класса X должен вызывать деструкторы своих непосредственных членов, а не пре-деструктор. ну gcc ведь как-то работает, т.е. задача по сути решаемая. |
||||
|
|||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если по стандарту, то он называется destructor, а то , что определяет пользователь destructor`s body..
ну так разноглассие ввиду неправильно подобранных названий, предыдущий абзац "решает" эту проблему ну а если еще и соответствовать пункту о return, то условно
|
||||||
|
|||||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Сильно зависит от контекста. Например тут:
А тут:
VS скорее всего не вдается в такие тонкости и просто лепит инстанс деструктора безусловно |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
в gcc нет никаких волнений по этому поводу, все деструкторы нормально вызываются. в моем примере там вообще ничего нету кроме auto_ptr<XImpl>. На эту тонкость студии тоже по всей видимости плевать
Да, так и есть. Ну в общем уже примерно понятно почему и как..тему закрываю, всем спасибо (хотя дискуссию конечно можно продолжить) Это сообщение отредактировал(а) azesmcar - 25.1.2011, 12:05 |
|||
|
||||
| xvr |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
А вот если добавить описание класса Y (с деструктором), то его позовут -
|
||||||||
|
|||||||||
| azesmcar |
|
||||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
xvr
Не совсем понял..можно выложить полный исходники тестового примера? Я только что проверил, все деструкторы вызываются нормально. Добавлено через 7 минут и 21 секунду выкладываю свой пример x.h
ximpl.h
x.cpp
ximpl.cpp
выводит
на gcc version 4.5.1 |
||||||||||
|
|||||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В примере деструктор Y не вызывается (вне зависимости от исключений и от чего то бы ни было Если раскоментарить тело класса Y в файле 1.cpp, то деструктор вызывается Присоединённый файл ( Кол-во скачиваний: 4 )
bug.zip 0,73 Kb |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Сборка: g++ 1.cpp 2.cpp
Это сообщение отредактировал(а) xvr - 25.1.2011, 12:50 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
xvr
Это не баг, деструктор в файле 1.cpp явно недоступен, его там просто нет, как и описания всего класса. Ошибка gcc в том, что он не предупредил об этом (странно кстати). Тут кстати SomeClass и не нужен вовсе, он и без этого не будет вызываться. Все дело в том, что у тебя нет деструктора в классе X, а значит он будет сгенерирован компилятором, сгенерирован он будет естестественно в файле 1.cpp, где он никак не может видеть деструктора класса Y и соответственно вызвать его никак не может. Добавлено через 4 минуты и 14 секунд http://www.gotw.ca/publications/mill12.htm
Это сообщение отредактировал(а) azesmcar - 25.1.2011, 13:01 |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
PS. Я добавил кое что к примеру, gcc по прежнему вполне счастлив, но результат зависит от порядка линковки файлов:
Вот такие пироги Присоединённый файл ( Кол-во скачиваний: 2 )
bug.zip 0,84 Kb |
||||||
|
|||||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Да, в этом он ошибается Но по части кода ведет он себя как и ожидалось. А вот у меня ситуация немного другая, gcc работает, а VS - нет. Добавлено через 53 секунды вот это уже интереснее |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |