Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 28, 2009 16:42:18

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

методи які викликаються при видаленні обєктів

Ось такий код забирає в мене всю оперативку.

>>> from zope.i18nmessageid import Message
>>> while 1:
... m = Message(u'hello')
...
клас Message написаний на сішці. Тобто наскільки я розумію нема ф-ції яка викликається при видаленні. tp_free == 0, але в документації пише що ця ф-ція необовязкова; Питання: як відбувається видалення обєкта? які ф-ції викликаються в конкретному випадку з класом Message?



Офлайн

#2 Ноя. 28, 2009 19:01:40

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

методи які викликаються при видаленні обєктів

Офлайн

#3 Ноя. 28, 2009 19:11:11

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

методи які викликаються при видаленні обєктів

regall
https://bugs.launchpad.net/zope3/+bug/257657
Bug #257657 reported by Gary Poster on 2008-08-13. Дивно чого вони того не виправляють



Офлайн

#4 Ноя. 28, 2009 19:30:44

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

методи які викликаються при видаленні обєктів

crchemist
Дивно чого вони того не виправляють
Вони взагалі над Zope 3.х мало працюють, всі сили на Zope2…, все-таки ком'юніті велике, багів багато, тому Zope2+Plone гарно підтримуються



Офлайн

#5 Ноя. 28, 2009 19:34:33

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

методи які викликаються при видаленні обєктів

zope.i18nmessageid в плоні використовується



Офлайн

#6 Ноя. 28, 2009 21:35:58

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

методи які викликаються при видаленні обєктів

Еще есть 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, которая не освобождалась.


Если хотите - можете слать баг-фикс.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version