Кое-что нашел по этой проблеме.
Чтобы смоделировать проблему, открываем форму, в которой происходит такая проблема, и закрываем. И повторяем несколько раз - происходит Segmentation Fault.
Опытным путем установил: если в методе, который вызывается в момент закрытия формы, удалить строчку sip.delete(dialog), то сегфолт не происходит. Но от этого после 30 минут работы объем занимаемой программой памяти вырос до 2Гб! Вернул строчку. Далее в файле, где происходит создание окна формы, закомментировал в классе диалогового окна всё содержимое методов _init_() и destroy(). По результатам теста сегфолтов нет. Последовательно раскомментировал строчки. После того как раскомментировал self.addModels('Visits', CF02512VisitsModel(self)), произошел сегфолт. Далее раскомментировал строчку del self.modelVisits внутри метода destroy() - сегфолт прекратился. Из этого сделал вывод: неудаленные старые модели и впоследствии созданные заново - одна из возможных причин сегфолта.
Далее раскомментировал self.addModels('ActionsSummary', CFxxxActionsSummaryModel(self, True)), предусмотрительно раскомментировав и в destroy() строчку del self.modelActionsSummary - произошел сегфолт. В ходе изучения принципа работы данного класса выяснил, что одна подмодель этой модели нигде по завершении работы не удаляется:
class CActionsSummaryModel(CInDocTableModel):
class CUetCol(CFloatInDocTableCol):
def __init__(self, model):
CFloatInDocTableCol.__init__(self, u'УЕТ', 'amount', 6, precision=2)
self.model = model
Для решения проблемы прописал в destroy() формы:
if hasattr(self.modelActionsSummary, 'colUET'):
del self.modelActionsSummary.colUet.model
И после сегфолт прекратился. Сейчас раскомментирую оставшиеся строчки и ищу забытые к удалению модели.
А дальше… как говорится, чем дальше, тем темнее лес…
Использую команду sys.getrefcount(), чтобы узнать количество ссылок у объекта.
По результатам теста без команды del self.modelActionsSummary.colUet.model
sys.getrefcount(self.modelActionsSummary.colUet.model) выдает 4
sys.getrefcount(self.modelActionsSummary) выдает 4
Причем, эта проверка произошла До вызова команды del…
А после выполнения команды del self.modelActionsSummary.colUet.model
sys.getrefcount(self.modelActionsSummary) выдает 3.
У меня вопрос: как узнать, какие оставшиеся ссылки имеет объект self.modelActionsSummary?