Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> pimpl с применением std::auto_ptr не работает, конструктор пашет, а деструктор нет ;) 
V
    Опции темы
mes
Дата 24.6.2010, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(EvilsInterrupt @  24.6.2010,  09:43 Найти цитируемый пост)
Да и цель-то, сделать открытие в конструкторе, а освобождение в деструкторе и при этом не вынося декларацию класса CPrivate1 в основной инклуд

Покажите что сделали.. а то что то не вяжется smile



--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 24.6.2010, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



>>Покажите что сделали.. а то что то не вяжется
В хидере:
Код

namespace hdr {

  class CMain1 {
  public:
    CMain1();
    ~CMain1() {}
  private:
    std::auto_ptr<class CPrivate1> m_Ptr;
  };

} /* namespace hdr { */


в файле-реализации:
Код

  class CMain1::CPrivate1 {
  public:
    CPrivate1() : m_val(0)  { 
      M_MSG(m_val,"CPrivate1 constructor");
      m_val++;
    }
    ~CPrivate1()  {
      M_MSG(m_val,"CPrivate1 destructor"); 
      m_val++;
    }
  private:
    int m_val;
  };

  CMain1::CMain1() : m_Ptr(new CPrivate1)
  {
  }


В реальном проекте, не  в этом пустышке заместо "m_val(0)" идет открытие OpenSCManagerA, а в деструкторе CloseServiceHandle(m_hSCMngr).
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 24.6.2010, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(mes @  24.6.2010,  08:59 Найти цитируемый пост)
попробуйте пустой деструктор с определением в cpp добавить... 


Цитата(EvilsInterrupt @  24.6.2010,  10:02 Найти цитируемый пост)
  ~CMain1() {}

 smile  smile  smile 

Это сообщение отредактировал(а) mes - 24.6.2010, 11:11


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 24.6.2010, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



>>~CMain1() {}
почему вызвало удивление ?

Сейчас перенес в реализацию, думал роли не играет, и все ок. но  почему?
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 24.6.2010, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(mes @  24.6.2010,  09:22 Найти цитируемый пост)
и еще раз внимательно перечитайте http://forum.vingrad.ru/index.php?showtopi...t&p=2174264
до понимания происходящего.


P.S. чего то ссылка не работает..
имелся ввиду этот пост :
Цитата

Цитата(EvilsInterrupt)

Но, давайте взглянем на std::auto_ptr:

ну а теперь подумайте, где в первом примере формируется деструктор у auto_ptr в котором вызыватся delete содержимого.. 


Добавлено @ 08:52
Цитата(EvilsInterrupt)

разве что в деструктор ~CMain() добавил удаление m_Private


во во.. ) а теперь перенесите его внутрь класса  



Это сообщение отредактировал(а) mes - 24.6.2010, 11:25


--------------------
PM MAIL WWW   Вверх
baldina
Дата 24.6.2010, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



потому что именно в деструкторе ~CMain1() вызывается деструктор auto_ptr и вот в этой точке нужно полное определение CPrivate1, что бы правильно вызвать его деструктор.
т.е. CPrivate1 не надо показывать всем, просто функции, его использующие (в т.ч. ~CMain1()) должны быть в единице компиляции, где он известен
PM MAIL   Вверх
EvilsInterrupt
Дата 24.6.2010, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



baldina, Теперь понял, млин,  действительно все логично и никакого колдовства. А я уж было пожалел, что забыл бубен в отчем доме ;)))
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 24.6.2010, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



baldina, ну вот, не дали человеку немного подумать и самому разобраться smile преподнесли на блюдечке ..
 smile  smile 

Это сообщение отредактировал(а) mes - 24.6.2010, 11:29


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 24.6.2010, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



mes, ;) Вредный ты ;) Но  спасибо огромное )
PM MAIL WWW ICQ Jabber   Вверх
baldina
Дата 24.6.2010, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



mes, ну вопрос то не такой простой, как кажется, когда уже знаешь ответ...
а то еще подумает человек, что в С++ все через ж)))
PM MAIL   Вверх
mes
Дата 24.6.2010, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(EvilsInterrupt @  24.6.2010,  10:31 Найти цитируемый пост)
mes, ;) Вредный ты ;)

так я как лучше хотел 
smile
Цитата(baldina @  24.6.2010,  10:59 Найти цитируемый пост)
, ну вопрос то не такой простой, как кажется,

быть может.. мне просто показалось, что на тот момент вся нужная информация, для того чтоб придти к выводам была дана..
оставалось только соединить в целое.. 
smile

Цитата(baldina @  24.6.2010,  10:59 Найти цитируемый пост)
а то еще подумает человек, что в С++ все через ж))) 

ну да, пусть знает, что не всё, однако ..
 smile 



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0915 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.