Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Не срабатывает деструктор (число прочтений - 9794 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Не срабатывает деструктор
14. Июля 2006 :: 13:04
Печать  
Создаю класс в глобальном модуле, ссылку на него вроде никому не присваиваю, но при выходе из 1С деструктор не срабатывает. Как найти ошибку? У меня 1С++ версия 1.8.1.6
  
Наверх
ICQ  
IP записан
 
vig
Junior Member
**
Отсутствует


Мой опыт показывает, что
умирают обычно другие.

Сообщений: 34
Местоположение: Киев
Зарегистрирован: 21. Мая 2006
Пол: Мужской
Re: Не срабатывает деструктор
Ответ #1 - 14. Июля 2006 :: 13:58
Печать  
Интересно, как ты определил, что деструктор не срабатывает?
  
Наверх
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Не срабатывает деструктор
Ответ #2 - 14. Июля 2006 :: 19:22
Печать  
es3000

Поищи на itland тему "Пожиратель памяти" автор Палыч.
Где-то за 2003 год. Помоему, этот вопрос там пролетал.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не срабатывает деструктор
Ответ #3 - 17. Июля 2006 :: 04:51
Печать  
vig:
Элементарно: Сообщить "деструктор"

kms:
спасибо, щас посмотрю,
а есть какие-нибудь свои функции в 1С++ для отладки ссылок на объекты?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не срабатывает деструктор
Ответ #4 - 17. Июля 2006 :: 05:09
Печать  
Статью прочитал, в общем суть понятна.
Только как правильно в такой ситуации удалять объекты из памяти?
Как предлагается в статье - при помощи создания другого объекта - мне кажется неправильно
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Не срабатывает деструктор
Ответ #5 - 17. Июля 2006 :: 06:55
Печать  
Цитата:
Это особенность движка 1С, если создается объект в функции и потом ссылка на этот объект возвращается из нее, то пока в этой функции не будет создан еще один объект ссылка на предыдущий не обнулится.

Вот из этих реалий и приходится исходить.
Либо создавать объекты по-другому, либо собирать мусор, уничтожая "фабрику объектов".
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Не срабатывает деструктор
Ответ #6 - 17. Июля 2006 :: 07:01
Печать  
Deb

Плз, прокомментируй тему еще раз, с высоты 2006 года.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Deb
1c++ developer
Отсутствует


Sex, drugs and 1C

Сообщений: 41
Зарегистрирован: 21. Мая 2006
Re: Не срабатывает деструктор
Ответ #7 - 17. Июля 2006 :: 07:12
Печать  
es3000 писал(а) 14. Июля 2006 :: 13:04:
Создаю класс в глобальном модуле, ссылку на него вроде никому не присваиваю, но при выходе из 1С деструктор не срабатывает. Как найти ошибку? У меня 1С++ версия 1.8.1.6


Зачем тебе нужен деструктор при уничтожении все программы?
Если ты беспокоишься по поводу утечки памяти, то ее нет. Так как при закрытии программы все ее адресное простанство уничтожается и а память возвращается системе без учета каких либо моментов самого кода программы.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Не срабатывает деструктор
Ответ #8 - 17. Июля 2006 :: 07:23
Печать  
Deb писал(а) 17. Июля 2006 :: 07:12:
Зачем тебе нужен деструктор при уничтожении все программы?
Если ты беспокоишься по поводу утечки памяти, то ее нет.


Представь, что в конструкторе ты включил подогрев воды в ванной.
А в деструкторе - выключил.

Если же у тебя деструктор не вызывается - подогрев продолжает работать!
В итоге результат может оказаться разочаровывающим.


Три раза перекрестился, бух в котел - и там - сварился


Конечно, потери памяти при этом не произойдет. Но сможет ли это нас утешить?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не срабатывает деструктор
Ответ #9 - 17. Июля 2006 :: 07:32
Печать  
В общем у меня написана моя конфигурация с использованием 1С++. Там много всяких объектов, которые создают друг друга, обращаются друг к другу и т.д. До определенного момента все работало нормально, но потом при закрытии 1С стала вываливаться ошибка "недопустимая операция...".  В общем-то проблема у меня возникла с этим.

Начал разбираться, пока пришел к выводу, что это может быть из-за неверного удаления объектов из памяти.
Сейчас я все упростил до минимума: есть два глобальных объекта, один из них создает и использует у себя в модуле локальный объект. И есть третий глобальный объект "Лог". Два глобальных объекта и один локальный пишут сообщения в этот "Лог", в том числе и из своих деструкторов:

г_Об1 - создает м_Об1_1
г_Об2
г_Лог

При закрытии 1С срабатывает деструктор только для объекта г_Об1. Для остальных (м_Об1_1, г_Об2) деструктор не срабатывает.

В принципе я так думаю надо добиться правильного срабатывания деструкторов. Или как еще можно найти причину ошибки "недопустимая операция..." ?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не срабатывает деструктор
Ответ #10 - 17. Июля 2006 :: 07:34
Печать  
kms:

полностью согласен насчет "сварился" Улыбка)
получается у меня в 1С-ке тоже что-то варится, а отключить не знаю как
  
Наверх
ICQ  
IP записан
 
Deb
1c++ developer
Отсутствует


Sex, drugs and 1C

Сообщений: 41
Зарегистрирован: 21. Мая 2006
Re: Не срабатывает деструктор
Ответ #11 - 17. Июля 2006 :: 07:58
Печать  
es3000 писал(а) 17. Июля 2006 :: 07:32:
В общем у меня написана моя конфигурация с использованием 1С++. Там много всяких объектов, которые создают друг друга, обращаются друг к другу и т.д. До определенного момента все работало нормально, но потом при закрытии 1С стала вываливаться ошибка "недопустимая операция...".  В общем-то проблема у меня возникла с этим.

Начал разбираться, пока пришел к выводу, что это может быть из-за неверного удаления объектов из памяти.
Сейчас я все упростил до минимума: есть два глобальных объекта, один из них создает и использует у себя в модуле локальный объект. И есть третий глобальный объект "Лог". Два глобальных объекта и один локальный пишут сообщения в этот "Лог", в том числе и из своих деструкторов:

г_Об1 - создает м_Об1_1
г_Об2
г_Лог

При закрытии 1С срабатывает деструктор только для объекта г_Об1. Для остальных (м_Об1_1, г_Об2) деструктор не срабатывает.

В принципе я так думаю надо добиться правильного срабатывания деструкторов. Или как еще можно найти причину ошибки "недопустимая операция..." ?

В процедуре при закрытии системы:
м_Об1_1 = "";
г_Об2 = "";

  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Не срабатывает деструктор
Ответ #12 - 29. Ноября 2010 :: 14:03
Печать  
Ну вот и я наступил на те же грабли.

Получается, что в Деструкторе вообще нельзя ничего делать?
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Не срабатывает деструктор
Ответ #13 - 29. Ноября 2010 :: 14:23
Печать  
Правильнее будет сказать так:

Нельзя использовать деструктор, если глобальный экземпляр этого класса удаляется в "ПриЗавершенииРаботыСистемы".

Во всех других случаях - можно.
  
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не срабатывает деструктор
Ответ #14 - 29. Ноября 2010 :: 14:52
Печать  
ИМХО ты про деструктор и завершение неверно написал.
Расскажи ситуацию подробнее.

Вообще обычно бывает так: если деструктор не вызывается, то есть кольцевые ссылки, при этом неважно, глобальный или локальный объект, где и как создан.
Т.е. при разборе ситуации нужно найти эти кольцевые ссылки и избавиться от них, если это нужно по логике работы.
Если же по логике подобное кольцо ссылок правильно, нужно принимать доп.меры по завершению работы объектов.

Одним из популярных и простых способов является искусственное завершение работы одного из закольцованных объектов в обработчике события ПриЗавершенииРаботыСистемы, после чего автоматом завершают свою работу другие объекты, если кольцо ссылок разорвано.

Например, у меня было так - есть глоб.классы артСистема и артФабрикаСобытий, которые ссылаются друг на друга и нормально не завершаются. Для решения проблемы я добавил в ПриЗавершенииРаботыСистемы вызов спец. метода артСистема.ЗавершитьРаботу(), в которой обнулял ссылку на объект артФабрикаСобытий (_фабрикаСобытий = 0), в результате чего вызывался деструктор этой фабрики, а уже после завершения этого метода автоматически вызывался деструктора артСистема.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать