Найти - Пользователи
Полная версия: методи які викликаються при видаленні обєктів
Начало » Python для экспертов » методи які викликаються при видаленні обєктів
1
crchemist
Ось такий код забирає в мене всю оперативку.
>>> from zope.i18nmessageid import Message
>>> while 1:
... m = Message(u'hello')
...
клас Message написаний на сішці. Тобто наскільки я розумію нема ф-ції яка викликається при видаленні. tp_free == 0, але в документації пише що ця ф-ція необовязкова; Питання: як відбувається видалення обєкта? які ф-ції викликаються в конкретному випадку з класом Message?
regall
https://bugs.launchpad.net/zope3/+bug/257657
crchemist
regall
https://bugs.launchpad.net/zope3/+bug/257657
Bug #257657 reported by Gary Poster on 2008-08-13. Дивно чого вони того не виправляють
regall
crchemist
Дивно чого вони того не виправляють
Вони взагалі над Zope 3.х мало працюють, всі сили на Zope2…, все-таки ком'юніті велике, багів багато, тому Zope2+Plone гарно підтримуються
crchemist
zope.i18nmessageid в плоні використовується
Андрей Светлов
Еще есть tp_dealloc.
С него удаление начинается. tp_free удаляет память, не вызывая деструктора. Т.е. то, что было выделено через malloc - не удалится.
tp_free обычно указывает на PyObject_Free - аналог free, работающий с Питоновским memory pool.
tp_dealloc вызывает tp_free после того, как удалит все “внутренности”.

Как я вижу по исходникам, проблема таки в удалении.
Закомментирована проблемная строка, следующая - исправление.
static void
Message_dealloc(Message *self)
{
Message_clear(self);
/* self->base.ob_type->tp_free((PyObject*)self); */
PyUnicode_Type.tp_dealloc((PyObject*)self);
}
вызывалась именно tp_free, а нужно дергать деструктор базового класса.
Юникод держит в себе Py_UNICODE *str, которая не освобождалась.


Если хотите - можете слать баг-фикс.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB