LINUX.ORG.RU

вопрос по python c api


0

0

можно как-то вызвать функцию при уничтожении строки ?
есть PyObject со строкой, нужно при уничтожении (или в любое время после) этой стоки освободить некоторую память, чтобы не было утечки

(идея в том, чтобы прикрутить в буст-питону конвентер между кодировками,
но тогда нужно возвращать новый буфер, и не понятно кто его будет освобождать)


Ответ на: комментарий от anotheranonymous

тут работать надо с pyobject-ами, а не с с++-ми объектами, такой
интрефейс у конвентеров типов - принять pyobject, вернуть ссылку на буфер с, например, строкой. и нужно как-то отследить смерть этого pyobject-а

kaj
() автор топика
Ответ на: комментарий от tailgunner

да, буст.птон уже везде используется
но вроде как это и все равно, нужно отследить смерть pyobjecta,
значит нужен с-api

kaj
() автор топика

Страсти какие-то... Может, weakref привинтить? Подозреваю, что буфер, о котором идёт речь, будет ненужен сразу после того, как отработает конструктор питонного объекта, так зачем держать в памяти, пока объект не помрёт? Может, лучше std::string возвращать? Или smart pointer, о чём выше уже сказали.

const86 ★★★★★
()
Ответ на: комментарий от const86

ну например в с++ есть функция f(const char*);
чтобы из питона вызвать ее f(u'hello') нужно написать для буст-питона
такой класс:

struct char_extractor
{
	static /* const */ char & execute (PyObject & obj)
	{
		if (PyString_Check (& obj))
		{
			return PyString_AsString (& obj);
		}
		else if (PyUnicode_Check (& obj))
		{
			// выделяем буфер, перекодируем, возвращаем на него ссылку
		}
	}
};

буфер нужен на время этого вызова, потом надо как-то освободить
зачем:
есть много функций на с++ с аргументами либо char*, либо wchar_t* в зависимости от макросов, вместо того, чтобы генерить для всех обертки с std::string хотелось бы написать один класс который все сделает

kaj
() автор топика
Ответ на: комментарий от kaj

> а куда привинчивать weakref ?

В таком виде, как выше - наверное, никуда не привинтишь. Я думал, речь идёт про выходные значения, а оказывается - про входные.

const86 ★★★★★
()
Ответ на: комментарий от const86

ну раз никто не знает, сделал влоб, заменил виртуальную таблицу
если кому понадобится, кусок кода: http://pastebin.com/m4cb147bc

kaj
() автор топика

weakref или переопредели метод __del__ у строки.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.