![]() |
|
Модераторы: 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 |
||||||||
|
|||||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |