powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / auto_ptr в PImpl
25 сообщений из 30, страница 1 из 2
auto_ptr в PImpl
    #34609940
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В заголовочном файле объявил:

Код: plaintext
1.
2.
3.
4.
5.
6.
include <memory>

class AImpl;
class A {
    std::auto_ptr<AImpl> impl;


В реализации соотвественно:
Код: plaintext
1.
2.
3.
4.
5.
6.
class AImpl {
};

A::A () :
__impl(new AImpl) {};


Так, вот, что получается: в заголовочном файле 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 будет определен. Что-то я не понимаю этого поведения...
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34609994
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
memory прицепи, а то отсюда ничего не видно
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34610176
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
      /**
       *  When the %auto_ptr goes out of scope, the object it owns is deleted.
       *  If it no longer owns anything (i.e., @c get() is @c NULL), then this
       *  has no effect.
       *
       *  @if maint
       *  The C++ standard says there is supposed to be an empty throw
       *  specification here, but omitting it is standard conforming.  Its
       *  presence can be detected only if _Tp::~_Tp() throws, but this is
       *  prohibited.  [17.4.3.6]/2
       *  @end maint
       */
      ~auto_ptr() { delete _M_ptr; }


251 - деструктор
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34610237
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А попробуй классу A нарисовать деструктор. Вот тоько его определение вытащи в cpp
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34610267
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedА попробуй классу A нарисовать деструктор. Вот тоько его определение вытащи в cpp

Ёшкин кот, ты гений, blinded!

Т.е. деструктор по умолчанию создается для каждого включения (т.е. реализуется в определении класса), но имеет силу как "слабая" фукнция (дабы разрешить проблему совпадения имен).
Так?
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34610359
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю как это по-научному, я просто поставил себя на место компилятора - не получилось деструктор А сгенерить
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34611780
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhТ.е. деструктор по умолчанию создается для каждого включения…
Так?если юзерского деструктора нет, создаётся деструктор по умолчанию (то же с конструктором, кажись), если юзерского деструктора нет, деструктора по умолчанию не создаётся. Если не ошибаюсь, это ещё с каменного века так.
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34611783
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мля…
если юзерского деструктора нет, создаётся деструктор по умолчанию (то же с конструктором, кажись), если юзерский деструктор есть, деструктора по умолчанию не создаётся. Если не ошибаюсь, это ещё с каменного века так.
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34611934
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoмля…
если юзерского деструктора нет, создаётся деструктор по умолчанию (то же с конструктором, кажись), если юзерский деструктор есть, деструктора по умолчанию не создаётся. Если не ошибаюсь, это ещё с каменного века так.

Могу даже уточнить. Про деструктор и конструктор по умолчанию правельно. Дополнительно по умолчанию создаются конструктор копирования, оператор копирования и две функции взятия адреса. Вроде все.

Так, что я не спорю, что он создается. Просто получается, что создается для каждого включения. А раз так, то необходимо, чтобы эти функции были "слабыми" (в объектном файле), иначе возникнут одинаковые имена в разных модулях.

Но это я насочинял, и поэтому спрашиваю, как на самом деле. :)
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34611966
Akh: Так, что я не спорю, что он создается. Просто получается, что создается для каждого включения. А раз так, то необходимо, чтобы эти функции были "слабыми" (в объектном файле), иначе возникнут одинаковые имена в разных модулях.

Но это я насочинял, и поэтому спрашиваю, как на самом деле. :)


вроде как в объектнике, содержащим код самого первого неинлайнового метода класса.

но что если таких методов нет? не помню точно, но либо внутренняя компановка в каждом модуле использующем класс, либо подстановка..

ps
на g++ (GCC) 3.2.3 (mingw special 20030504-1) все обошлось без варнингов..
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34612142
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понимаете в чем дело... Текущая версия стандарта запрещает параметризацию шаблонов стандартной библиотеки не полными типами, которым является в вашем случае AImpl. Поэтому корректным решением этого вопроса является написание аналога auto_ptr - это позволит держать руку на пульсе и в случае смены реализации STL быть спокойным хотя бы в этой части.
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34612153
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно подумато что компилятор знает в лицо все типы STL. Скорее всего ту более общие механизмы и с собственным шаблоном приключится тоже самое
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34612198
blinded: Можно подумато что компилятор знает в лицо все типы STL. Скорее всего ту более общие механизмы и с собственным шаблоном приключится тоже самое

компилятор знает namespace %)

а, вообще, согласен, странно это - никогда не встречал подобного ограничения
пролистал сейчас наскоро книжки Страуструпа и Степанова, ничего подобного не заметил
ну может плохо смотрел, а стандарта под рукой нет..

напротив, Майерс и Александреску с Саттером приводили пример подобной реализации PIMPL
хотя оговаривались, что это может быть не лучший выбор в силу отсутствия у auto_ptr полноценной семантики копирования
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34612626
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимирнапротив, Майерс и Александреску с Саттером приводили пример подобной реализации PIMPL
хотя оговаривались, что это может быть не лучший выбор в силу отсутствия у auto_ptr полноценной семантики копирования

Не соблоговолите расшифровать ? Зачем при реализации PIMPL "полноценная семантика копирования" ???
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34612747
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир
напротив, Майерс и Александреску с Саттером приводили пример подобной реализации PIMPL
хотя оговаривались, что это может быть не лучший выбор в силу отсутствия у auto_ptr полноценной семантики копирования

Майерс предлогал auto_ptr при обсуждении исключений в кострукторе, здесь он наоборот его хвалил. При обсуждении PImpl он не упоминал ни про какие распределители памяти. Саттер же, вообще, для PImpl предлогал shared_ptr, ни капли не упоминая про aut_ptr.

Не подскажете ли, где они приводоли подобные примеры?
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34612752
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковПонимаете в чем дело... Текущая версия стандарта запрещает параметризацию шаблонов стандартной библиотеки не полными типами, которым является в вашем случае AImpl. Поэтому корректным решением этого вопроса является написание аналога auto_ptr - это позволит держать руку на пульсе и в случае смены реализации STL быть спокойным хотя бы в этой части.

Серьезное заявление. Есть стандарт октября 2003-го года. Если в нем это есть не подскажете ли раздел?
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34612847
Тынц.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh
Майерс предлогал auto_ptr при обсуждении исключений в кострукторе, здесь он наоборот его хвалил. При обсуждении PImpl он не упоминал ни про какие распределители памяти. Саттер же, вообще, для PImpl предлогал shared_ptr, ни капли не упоминая про aut_ptr.

Не подскажете ли, где они приводоли подобные примеры?

http://www.gotw.ca/publications/using_auto_ptr_effectively.htm (Саттер)

Там же в Notes пару ссылок, в т.ч. и на Майерса.
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34613066
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мальчики не ссорьтесь. В стандарте вы ничего не найдете, поскольку вся проблема в механизме инстанциации шаблонов, не может компилятор не имея декларации класса AImpl правильно проинстанциировать деструктор auto_ptr. Но чтобы не ударить в грязь лицом делает смелое предположение: AImpl - пустая структура
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34613092
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedМальчики не ссорьтесь. В стандарте вы ничего не найдете, поскольку вся проблема в механизме инстанциации шаблонов, не может компилятор не имея декларации класса AImpl правильно проинстанциировать деструктор auto_ptr. Но чтобы не ударить в грязь лицом делает смелое предположение: AImpl - пустая структура

Я тоже придерживаюсь этого мнения. Но, так как я не идельно знаю стандарт, вопрос остается более чем актуальным.
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34613171
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тынц. 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.
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34614305
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 года этого ограничения уже нет. Так что ждем выхода новой ревизии стандарта.
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34614840
Gluk (Kazan)]: Не соблоговолите расшифровать ? Зачем при реализации PIMPL "полноценная семантика копирования" ???

ну там в контейнер какой положить ;)

а так да, согласен фигню я сказал :(

выбор вида указателя на реализацию влияет разве что на конструктор копирования генерируемый по умолчанию, а вот его как раз в этом случае имеет смысл писать явно, ну или явно запретить
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34616338
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PIMPL в контейнер ?
Согласен, ты сказал фигню
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34616522
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков
для стандарта 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, думаю, что переопределение деструктора по умолчанию в области имеющей информацию о полном типе аргумента будет делать инстанцирование шаблона не полным типом корректным.
...
Рейтинг: 0 / 0
auto_ptr в PImpl
    #34617393
Gluk (Kazan): PIMPL в контейнер ?
Согласен, ты сказал фигню


я имел в виду сам класс, реализуемый посредством идиомы PIMPL
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / auto_ptr в PImpl
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]