|
|
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
В заголовочном файле объявил: Код: plaintext 1. 2. 3. 4. 5. 6. В реализации соотвественно: Код: plaintext 1. 2. 3. 4. 5. 6. Так, вот, что получается: в заголовочном файле auot_ptr не знает ничего о AImpl, но ему это и не нужно, так как удалять объект он будет в коде из файла реализации, где он уже все знает о этом классе. Но компилятор, &*(&, говорит: компилятор не прав /usr/include/c++/3.3.3/memory:251: warning: possible problem detected in invocation of delete operator: /usr/include/c++/3.3.3/memory:251: warning: invalid use of undefined type ` struct ManagerImpl' manager.h:17: warning: forward declaration of `struct ManagerImpl' /usr/include/c++/3.3.3/memory:251: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined. Как понял из перевода, что деструктор вызыватя не будет, даже если PImpl будет определен. Что-то я не понимаю этого поведения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 11:07 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
memory прицепи, а то отсюда ничего не видно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 11:20 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 251 - деструктор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 11:55 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
blindedА попробуй классу A нарисовать деструктор. Вот тоько его определение вытащи в cpp Ёшкин кот, ты гений, blinded! Т.е. деструктор по умолчанию создается для каждого включения (т.е. реализуется в определении класса), но имеет силу как "слабая" фукнция (дабы разрешить проблему совпадения имен). Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 12:13 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Не знаю как это по-научному, я просто поставил себя на место компилятора - не получилось деструктор А сгенерить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 12:31 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
AkhТ.е. деструктор по умолчанию создается для каждого включения… Так?если юзерского деструктора нет, создаётся деструктор по умолчанию (то же с конструктором, кажись), если юзерского деструктора нет, деструктора по умолчанию не создаётся. Если не ошибаюсь, это ещё с каменного века так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 17:30 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
мля… если юзерского деструктора нет, создаётся деструктор по умолчанию (то же с конструктором, кажись), если юзерский деструктор есть, деструктора по умолчанию не создаётся. Если не ошибаюсь, это ещё с каменного века так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 17:30 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
maXmoмля… если юзерского деструктора нет, создаётся деструктор по умолчанию (то же с конструктором, кажись), если юзерский деструктор есть, деструктора по умолчанию не создаётся. Если не ошибаюсь, это ещё с каменного века так. Могу даже уточнить. Про деструктор и конструктор по умолчанию правельно. Дополнительно по умолчанию создаются конструктор копирования, оператор копирования и две функции взятия адреса. Вроде все. Так, что я не спорю, что он создается. Просто получается, что создается для каждого включения. А раз так, то необходимо, чтобы эти функции были "слабыми" (в объектном файле), иначе возникнут одинаковые имена в разных модулях. Но это я насочинял, и поэтому спрашиваю, как на самом деле. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 18:06 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Akh: Так, что я не спорю, что он создается. Просто получается, что создается для каждого включения. А раз так, то необходимо, чтобы эти функции были "слабыми" (в объектном файле), иначе возникнут одинаковые имена в разных модулях. Но это я насочинял, и поэтому спрашиваю, как на самом деле. :) вроде как в объектнике, содержащим код самого первого неинлайнового метода класса. но что если таких методов нет? не помню точно, но либо внутренняя компановка в каждом модуле использующем класс, либо подстановка.. ps на g++ (GCC) 3.2.3 (mingw special 20030504-1) все обошлось без варнингов.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 18:13 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Понимаете в чем дело... Текущая версия стандарта запрещает параметризацию шаблонов стандартной библиотеки не полными типами, которым является в вашем случае AImpl. Поэтому корректным решением этого вопроса является написание аналога auto_ptr - это позволит держать руку на пульсе и в случае смены реализации STL быть спокойным хотя бы в этой части. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 19:40 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Можно подумато что компилятор знает в лицо все типы STL. Скорее всего ту более общие механизмы и с собственным шаблоном приключится тоже самое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 19:46 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
blinded: Можно подумато что компилятор знает в лицо все типы STL. Скорее всего ту более общие механизмы и с собственным шаблоном приключится тоже самое компилятор знает namespace %) а, вообще, согласен, странно это - никогда не встречал подобного ограничения пролистал сейчас наскоро книжки Страуструпа и Степанова, ничего подобного не заметил ну может плохо смотрел, а стандарта под рукой нет.. напротив, Майерс и Александреску с Саттером приводили пример подобной реализации PIMPL хотя оговаривались, что это может быть не лучший выбор в силу отсутствия у auto_ptr полноценной семантики копирования ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 20:25 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Голенков Владимирнапротив, Майерс и Александреску с Саттером приводили пример подобной реализации PIMPL хотя оговаривались, что это может быть не лучший выбор в силу отсутствия у auto_ptr полноценной семантики копирования Не соблоговолите расшифровать ? Зачем при реализации PIMPL "полноценная семантика копирования" ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 08:37 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир напротив, Майерс и Александреску с Саттером приводили пример подобной реализации PIMPL хотя оговаривались, что это может быть не лучший выбор в силу отсутствия у auto_ptr полноценной семантики копирования Майерс предлогал auto_ptr при обсуждении исключений в кострукторе, здесь он наоборот его хвалил. При обсуждении PImpl он не упоминал ни про какие распределители памяти. Саттер же, вообще, для PImpl предлогал shared_ptr, ни капли не упоминая про aut_ptr. Не подскажете ли, где они приводоли подобные примеры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 09:53 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковПонимаете в чем дело... Текущая версия стандарта запрещает параметризацию шаблонов стандартной библиотеки не полными типами, которым является в вашем случае AImpl. Поэтому корректным решением этого вопроса является написание аналога auto_ptr - это позволит держать руку на пульсе и в случае смены реализации STL быть спокойным хотя бы в этой части. Серьезное заявление. Есть стандарт октября 2003-го года. Если в нем это есть не подскажете ли раздел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 09:56 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Akh Майерс предлогал auto_ptr при обсуждении исключений в кострукторе, здесь он наоборот его хвалил. При обсуждении PImpl он не упоминал ни про какие распределители памяти. Саттер же, вообще, для PImpl предлогал shared_ptr, ни капли не упоминая про aut_ptr. Не подскажете ли, где они приводоли подобные примеры? http://www.gotw.ca/publications/using_auto_ptr_effectively.htm (Саттер) Там же в Notes пару ссылок, в т.ч. и на Майерса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 10:43 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Мальчики не ссорьтесь. В стандарте вы ничего не найдете, поскольку вся проблема в механизме инстанциации шаблонов, не может компилятор не имея декларации класса AImpl правильно проинстанциировать деструктор auto_ptr. Но чтобы не ударить в грязь лицом делает смелое предположение: AImpl - пустая структура ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 11:41 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
blindedМальчики не ссорьтесь. В стандарте вы ничего не найдете, поскольку вся проблема в механизме инстанциации шаблонов, не может компилятор не имея декларации класса AImpl правильно проинстанциировать деструктор auto_ptr. Но чтобы не ударить в грязь лицом делает смелое предположение: AImpl - пустая структура Я тоже придерживаюсь этого мнения. Но, так как я не идельно знаю стандарт, вопрос остается более чем актуальным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 11:48 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Тынц. Akh Майерс предлогал auto_ptr при обсуждении исключений в кострукторе, здесь он наоборот его хвалил. При обсуждении PImpl он не упоминал ни про какие распределители памяти. Саттер же, вообще, для PImpl предлогал shared_ptr, ни капли не упоминая про aut_ptr. Не подскажете ли, где они приводоли подобные примеры? http://www.gotw.ca/publications/using_auto_ptr_effectively.htm (Саттер) Там же в Notes пару ссылок, в т.ч. и на Майерса. Ну, и, ни слова, что auto_ptr для PImpl плохо. Наборот: Using auto_ptr Effectively it follows the good practice of wrapping resource ownership in objects--a job that auto_ptr is well suited to do. We'll revisit this example again at the end. А эта ссылка на описание PImpl совсем другого автора (предисловие только Майерса). Из статьи я только понял, что auto_ptr не следует использовать в контейнерах, т.к. auto_ptr<> != copy auro_ptr<>, но, как правельно заметил Gluk, это не имеет никакого отношения к PImpl. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 12:04 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Akh Анатолий ШироковПонимаете в чем дело... Текущая версия стандарта запрещает параметризацию шаблонов стандартной библиотеки не полными типами, которым является в вашем случае AImpl. Поэтому корректным решением этого вопроса является написание аналога auto_ptr - это позволит держать руку на пульсе и в случае смены реализации STL быть спокойным хотя бы в этой части. Серьезное заявление. Есть стандарт октября 2003-го года. Если в нем это есть не подскажете ли раздел? для стандарта 2003 года это можно найти в 17.4.3.6 (выделенно мной) 17.4.3.6 Other functions [lib.res.on.functions] 1 In certain cases (replacement functions, handler functions, operations on types used to instantiate standard library template components ), the C++ Standard Library depends on components supplied by a C++ pro- gram. If these components do not meet their requirements, the Standard places no requirements on the implementation. 2 In particular, the effects are undefined in the following cases: — for replacement functions (18.4.1), if the installed replacement function does not implement the seman- tics of the applicable Required behavior paragraph. — for handler functions (18.4.2.2, 18.6.3.1, 18.6.2.2), if the installed handler function does not implement the semantics of the applicable Required behavior paragraph — for types used as template arguments when instantiating a template component, if the operations on the type do not implement the semantics of the applicable Requirements subclause (20.1.5, 23.1, 24.1, 26.1). Operations on such types can report a failure by throwing an exception unless otherwise speci- fied. — if any replacement function or handler function or destructor operation throws an exception, unless specifically allowed in the applicable Required behavior paragraph. — if an incomplete type (3.9) is used as a template argument when instantiating a template component. А вот в черновике стандарта 2006 года этого ограничения уже нет. Так что ждем выхода новой ревизии стандарта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 16:34 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)]: Не соблоговолите расшифровать ? Зачем при реализации PIMPL "полноценная семантика копирования" ??? ну там в контейнер какой положить ;) а так да, согласен фигню я сказал :( выбор вида указателя на реализацию влияет разве что на конструктор копирования генерируемый по умолчанию, а вот его как раз в этом случае имеет смысл писать явно, ну или явно запретить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 20:26 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
PIMPL в контейнер ? Согласен, ты сказал фигню ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2007, 08:31 |
|
||
|
auto_ptr в PImpl
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков для стандарта 2003 года это можно найти в 17.4.3.6 (выделенно мной) 17.4.3.6 Other functions [lib.res.on.functions] 1 In certain cases (replacement functions, handler functions, operations on types used to instantiate standard library template components ), the C++ Standard Library depends on components supplied by a C++ pro- gram. If these components do not meet their requirements, the Standard places no requirements on the implementation. 2 In particular, the effects are undefined in the following cases: ... — if an incomplete type (3.9) is used as a template argument when instantiating a template component. А вот в черновике стандарта 2006 года этого ограничения уже нет. Так что ждем выхода новой ревизии стандарта. Спасибо. Как я понял, стандарт "предупреждает". А учитывая те факты, что мы нашли опасную точку и тем более в следующием стандарте, возможно, эту проблему решат уже средствами C++/STL, думаю, что переопределение деструктора по умолчанию в области имеющей информацию о полном типе аргумента будет делать инстанцирование шаблона не полным типом корректным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2007, 10:07 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34611966&tid=2028613]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
45ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 369ms |

| 0 / 0 |
