Уведомления

Группа в Telegram: @pythonsu

#1 Июль 21, 2010 21:43:37

isergey
От:
Зарегистрирован: 2010-07-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Python boost вызов деструктора

Друзья, возникла проблема. Есть класс:
class ZConnection{
ZOOM_connection zc;
friend class ZResultSet;
ZOOM_connection _getYazConnection() const {return zc;}
//ZConnection (const ZConnection &);
//ZConnection &operator= (const ZConnection &);
public:
//ZOOM_connection _getYazConnection() const {return zc;}
ZConnection();
ZConnection(const ZOptions *zo);
~ZConnection ();
void connect (const string &hostname, int portnum);
ZResultSet* search(const ZQuery &zq);
};

Который я описал так:
class_<ZConnection>(“ZConnection”)
.def(init<const ZOptions *>())
.def(“connect”, &ZConnection::connect)
.def(“search”, &ZConnection::search, return_internal_reference<>())
;

Дело в том, что когда я возвращаю указатель на объект ZResultSet* из метода search, при удаленнии этого объекта не вызывается его деструктор и происходит утечка памяти.
Если я явно создам объект ZResultSet, то при удалении деструктор вызывается. Что происходит? Может необходимо указать дополнительные параметры при описании класса, для того чтобы объект по указателю удалялся корректно? Спасибо.

Решение:
Проблему удалось решить, поменяв описание метода:
.def(“search”, &ZConnection::search, return_value_policy<manage_new_object>())



Отредактировано (Июль 21, 2010 23:54:29)

Офлайн

#2 Июль 21, 2010 22:37:23

isergey
От:
Зарегистрирован: 2010-07-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Python boost вызов деструктора

Наверное это бредовое решение, но я добавил следующий метод:
class_<ZResultSet>(“ZResultSet”)
.def(“__del__”, &ZResultSet::del)

В методе ZResultSet.del явно вызывается деструктор



Офлайн

#3 Июль 21, 2010 23:05:54

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

Python boost вызов деструктора

какой деструктор, если у вас указан return_internal_reference?



Офлайн

#4 Июль 21, 2010 23:14:14

isergey
От:
Зарегистрирован: 2010-07-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Python boost вызов деструктора

Так что же мне делать? Как быть?



Офлайн

#5 Июль 21, 2010 23:53:18

isergey
От:
Зарегистрирован: 2010-07-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Python boost вызов деструктора

Таки нашел решение.
.def(“search”, &ZConnection::search, return_value_policy<manage_new_object>())



Офлайн

#6 Июль 21, 2010 23:56:13

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

Python boost вызов деструктора

Уже лучше. А возвращаемый ZResultSet точно всегда “новый объект”, который создается в search?



Офлайн

#7 Июль 22, 2010 00:06:38

isergey
От:
Зарегистрирован: 2010-07-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Python boost вызов деструктора

Да. Собственно вот код:
ZResultSet* ZConnection::search(const ZQuery &zq){
ZResultSet *rs = new ZResultSet(this, zq);

return rs;
}

Возник еще вопрос, а как насчет конструкторов копирования и прочих фишек, касаемых копирования объектов. Нужно ли их описывать в классе или же питон работает только с указателями?



Отредактировано (Июль 22, 2010 00:11:34)

Офлайн

#8 Июль 22, 2010 16:46:32

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

Python boost вызов деструктора

вообще-то политика по умолчанию в c++ <-> python преобразованиях - именно копирование.
Помимо политик можно указывать wrapper class аргументом шаблона в class_<>.

Вообще же, безотносительно к питону всегда стоит соблюдать несколько простых правил:
1. Для полиморфных объектов следует запретить копирование и присваивание, реализовать виртуальный деструктор.
2. Для неполиморфных нужно либо прописать явно присваивание/копирование, либо явно же их запретить.

Простейший способ запрета - унаследоваться от boost::noncopyable.



Офлайн

#9 Июль 23, 2010 14:41:05

isergey
От:
Зарегистрирован: 2010-07-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Python boost вызов деструктора

Андрей, спасибо за Ваши ответы!



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version