Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Утечка памяти при создании класса в классе. (число прочтений - 4181 )
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Утечка памяти при создании класса в классе.
05. Июля 2012 :: 17:58
Печать  
Из класса ТабличноеПоле.Сервис создается класс МенюЖурналаДок.
Происходит создание формы 500 раз, в результате сьедается много памяти и объектов users. Если в классе ТабличноеПоле.Сервис в процедуре "Конструктор()" закоментировать строку 462:
Код
Выбрать все
МенюЖурнала = СоздатьОбъект("МенюЖурналаДок");
 


то утечки памяти такой большой нет, но все же есть.
Что я делаю не так, вроде все ссылки поудалял.
Пример базы прикрепляю.
  

testClass_001.rar ( 872 KB | Загрузки )
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Утечка памяти при создании класса в классе.
Ответ #1 - 05. Июля 2012 :: 21:35
Печать  
Скорее всего, ты форму закрываешь штатно, через Форма.Закрыть, в этом случае 1С "течет".
пользуйся Система.ЗакрытьФорму(), почти не протекает Улыбка
зы код не смотрел
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Утечка памяти при создании класса в классе.
Ответ #2 - 06. Июля 2012 :: 06:12
Печать  
Принудительно разрушать служебный класс, не?
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Утечка памяти при создании класса в классе.
Ответ #3 - 06. Июля 2012 :: 10:45
Печать  
Добавь в класс "ТабличноеПоле.Сервис" обработчик события ПриУничтожении и в нем уничтожай объекты.
Типа такого:
Код
Выбрать все
Процедура ПриУничтожении() Экспорт
	Источник  = "";
 ИсточникТЗ  = "";
 ИсточникПодвал  = "";
 ПоставщикПодвал  = "";
 ИсточникТЗПодвал  = "";
 Картинки  = "";
 КонтМеню  = "";
 МенюЖурнала  = "";;
 ТабличноеПоле  = "";
 КоманднаяПанель  = ""; // : ПанельЖурнала

КонецПроцедуры
 


P.S. Бегло проверил - память не течет.
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Утечка памяти при создании класса в классе.
Ответ #4 - 06. Июля 2012 :: 11:45
Печать  
zk96 писал(а) 06. Июля 2012 :: 10:45:
Добавь в класс "ТабличноеПоле.Сервис" обработчик события ПриУничтожении и в нем уничтожай объекты.
Типа такого:
Код
Выбрать все
Процедура ПриУничтожении() Экспорт
	Источник  = "";
 ИсточникТЗ  = "";
 ИсточникПодвал  = "";
 ПоставщикПодвал  = "";
 ИсточникТЗПодвал  = "";
 Картинки  = "";
 КонтМеню  = "";
 МенюЖурнала  = "";;
 ТабличноеПоле  = "";
 КоманднаяПанель  = ""; // : ПанельЖурнала

КонецПроцедуры
 


P.S. Бегло проверил - память не течет.


Спасибо, помогло, но все равно вся память не освобождается. Похоже что Класс ТабличноеПоле.Сервис в форме не уничтожается.
  
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Утечка памяти при создании класса в классе.
Ответ #5 - 06. Июля 2012 :: 12:13
Печать  
artbear писал(а) 05. Июля 2012 :: 21:35:
Скорее всего, ты форму закрываешь штатно, через Форма.Закрыть, в этом случае 1С "течет".
пользуйся Система.ЗакрытьФорму(), почти не протекает Улыбка
зы код не смотрел


Не помогло. Написал в модуле форму в процедуре "ФормаПриСоздании(_Форма)"
вызов
Код
Выбрать все
глСистема.ЗакрытьФорму(Контекст,0); 

- утечка памяти так и осталась. Причем провел тест и с ручным закрытием 500 документов, памтять отожралась ровно такая же как и при вызове Форма.Закрыть().
Если же в модуле формы закомментировать создание класса "ТабличноеПоле.Сервис" - то памяти практически не жрет. Это значит что утечка в создании класса-наследника ТабличноеПоле на форме.
Вызов
Код
Выбрать все
ТПФр.Уничтожить(); 

выводит сообщение что "Поле агрегатного объекта не обнаружено (Уничтожить)"
  
Наверх
IP записан
 
stepman1
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 86
Зарегистрирован: 02. Июля 2007
Re: Утечка памяти при создании класса в классе.
Ответ #6 - 27. Августа 2015 :: 05:14
Печать  
Тоже заметил утечку памяти

при использовании класса наследника табличного поля

Если на форме создавать табличное поле - все норм. -  утечки не происходит.

Если на форме создавать табличное поле    классом - наследником табличного поля -  то утечка памяти.

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


update.

странно, у класса наследника табличного поля не вызываются методы деструктор и ПриУничтожении(Табличноеполе)
1с++ 3.2.4.3
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Утечка памяти при создании класса в классе.
Ответ #7 - 27. Августа 2015 :: 06:08
Печать  
взаимные ссылки скорее всего, поэтому и деструктор не вызывается
  

1&&2&&3
Наверх
 
IP записан
 
stepman1
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 86
Зарегистрирован: 02. Июля 2007
Re: Утечка памяти при создании класса в классе.
Ответ #8 - 27. Августа 2015 :: 07:24
Печать  
переменная в классе хранила  Сам(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле") Подмигивание
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать