Pavel3333 1,148 Posted May 21, 2018 (edited) @Mixaill, Вы приводили листинг кода вызова моделей некоторое время назад: Я обнаружил в нем в своих функциях утечку памяти (а соответствии со вторым ответом тут) после того, как были отпарсены аргументы. Возник вопрос - в экспортируемых функциях нужно делать Py_DECREF(args) после того, как отпарсили tuple аргументов? Edited May 21, 2018 by Pavel3333 1 Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #431271 Posted May 21, 2018 (edited) 2 hours ago, Pavel3333 said: Возник вопрос - в экспортируемых функциях нужно делать Py_DECREF(args) после того, как отпарсили tuple аргументов? Может Mixaill воспользовался семантикой перемещения))) А вообще в доках написано: PyObject* PyImport_AddModule(const char *name) Return value: Borrowed reference. Edited May 21, 2018 by SkepticalFox Quote Share this post Link to post Short link Share on other sites
Pavel3333 1,148 #431283 Posted May 21, 2018 4 часа назад, SkepticalFox сказал: Return value: Borrowed reference. Вот тут всё верно, тут утечек нет. 4 часа назад, SkepticalFox сказал: семантикой перемещения))) поясни :) По сути надо документировать аргументы, передаваемые конкретной CPython-функции, и смотреть, какие из них можно декрефать, а какие нельзя ни в коем случае. Если передаются всяческие переменные - декрефать можно, а в случае, если функции переданы классы, модули, функции, атрибуты, константы - это фиаско. 1 Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #431309 Posted May 21, 2018 1 hour ago, Pavel3333 said: Если передаются всяческие переменные - декрефать можно, а в случае, если функции переданы классы, модули, функции, атрибуты, константы - это фиаско. Насколько мне подсказал www.google.com, довольно неплохо процесс работы со ссылками описан здесь. Если максимально сжать написанное, в большинстве случаев функции не крадут право собственности на ссылку, но почти всегда его отдают, если, конечно, не указано иное. Право собственности на ссылку означает, что та функция, которая им обладает, отвечает за вызов Py_DECREF. Единственный вопрос, который пока еще остается открытым, это когда наш уважаемый Павел таки освоит основы использования поисковика, научится читать в оригинале и перестанет задавать бородатые вопросы? Quote Share this post Link to post Short link Share on other sites
Pavel3333 1,148 #431311 Posted May 21, 2018 6 минут назад, GPCracker сказал: Единственный вопрос, который пока еще остается открытым, это когда наш уважаемый Павел таки освоит основы использования поисковика, научится читать в оригинале и перестанет задавать бородатые вопросы? Ответ очевиден - когда стану таким же бородатым, как и мои вопросы. 1 Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #431314 Posted May 21, 2018 @Pavel3333, возвращаясь к твоему вопросу, "stealing reference" and "returning borrowed reference" это исключения, и они прописаны в доках для каждой "исключительной" функции. Есть еще одно простое правило - конструктор никогда не возвращает "borrowed" ссылку - в противном случае объект будет сразу же уничтожен сборщиком мусора. Поэтому если ты создаешь какой-то объект внутри функции - его нужно уничтожить самому, или отдать функции, которая "украдет" ссылку. Если же ты создал объект, скормил его функции, которая ссылку не крадет, а потом он тебе стал не нужен - ты должен его самостоятельно уничтожить. Твой "второй ответ из шапки" как раз и показывает, что в первом ответе в коде про***но уничтожение сразу двух объектов - полученного метода и результата вызова этого метода. Quote Share this post Link to post Short link Share on other sites
Pavel3333 1,148 #431320 Posted May 21, 2018 @GPCracker я так и делаю, если объект заюзан и не нужен - уничтожаю его. Но args, передаваемые моей функции - не уничтожаю. В этом и утечка. Притом в доках args'ы не декрефаются. 1 Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #431321 Posted May 21, 2018 (edited) 19 minutes ago, Pavel3333 said: Но args, передаваемые моей функции - не уничтожаю. А ты уверен, что твою функцию не считают "крадущей" ссылки? Кто и где ее вызывает? Кстати, нашел еще несколько интересных ссылок по теме (раз, два, три). Edited May 21, 2018 by GPCracker 1 Quote Share this post Link to post Short link Share on other sites