Jump to content
Korean Random
Pavel3333

Утечка памяти

Recommended Posts

@Mixaill, Вы приводили листинг кода вызова моделей некоторое время назад: 

Я обнаружил в нем в своих функциях утечку памяти (а соответствии со вторым ответом тут) после того, как были отпарсены аргументы. Возник вопрос - в экспортируемых функциях нужно делать Py_DECREF(args) после того, как отпарсили tuple аргументов?

Edited by Pavel3333
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites
2 hours ago, Pavel3333 said:

Возник вопрос - в экспортируемых функциях нужно делать Py_DECREF(args) после того, как отпарсили tuple аргументов?

Может Mixaill воспользовался семантикой перемещения)))

А вообще в доках написано:

PyObject* PyImport_AddModule(const char *name)

Return value: Borrowed reference.

Edited by SkepticalFox

Share this post


Link to post

Short link
Share on other sites
4 часа назад, SkepticalFox сказал:

Return value: Borrowed reference.

Вот тут всё верно, тут утечек нет.

 

4 часа назад, SkepticalFox сказал:

семантикой перемещения)))

поясни :)

По сути надо документировать аргументы, передаваемые конкретной CPython-функции, и смотреть, какие из них можно декрефать, а какие нельзя ни в коем случае. Если передаются всяческие переменные - декрефать можно, а в случае, если функции переданы классы, модули, функции, атрибуты, константы - это фиаско.

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites
1 hour ago, Pavel3333 said:

Если передаются всяческие переменные - декрефать можно, а в случае, если функции переданы классы, модули, функции, атрибуты, константы - это фиаско.

Насколько мне подсказал www.google.com, довольно неплохо процесс работы со ссылками описан здесь. Если максимально сжать написанное, в большинстве случаев функции не крадут право собственности на ссылку, но почти всегда его отдают, если, конечно, не указано иное. Право собственности на ссылку означает, что та функция, которая им обладает, отвечает за вызов Py_DECREF. Единственный вопрос, который пока еще остается открытым, это когда наш уважаемый Павел таки освоит основы использования поисковика, научится читать в оригинале и перестанет задавать бородатые вопросы?

Share this post


Link to post

Short link
Share on other sites
6 минут назад, GPCracker сказал:

Единственный вопрос, который пока еще остается открытым, это когда наш уважаемый Павел таки освоит основы использования поисковика, научится читать в оригинале и перестанет задавать бородатые вопросы?

Ответ очевиден - когда стану таким же бородатым, как и мои вопросы.

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

@Pavel3333, возвращаясь к твоему вопросу, "stealing reference" and "returning borrowed reference" это исключения, и они прописаны в доках для каждой "исключительной" функции. Есть еще одно простое правило - конструктор никогда не возвращает "borrowed" ссылку - в противном случае объект будет сразу же уничтожен сборщиком мусора. Поэтому если ты создаешь какой-то объект внутри функции - его нужно уничтожить самому, или отдать функции, которая "украдет" ссылку. Если же ты создал объект, скормил его функции, которая ссылку не крадет, а потом он тебе стал не нужен - ты должен его самостоятельно уничтожить. Твой "второй ответ из шапки" как раз и показывает, что в первом ответе в коде про***но уничтожение сразу двух объектов - полученного метода и результата вызова этого метода.

Share this post


Link to post

Short link
Share on other sites

@GPCracker я так и делаю, если объект заюзан и не нужен - уничтожаю его. Но args, передаваемые моей функции - не уничтожаю. В этом и утечка. Притом в доках args'ы не декрефаются.

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites
19 minutes ago, Pavel3333 said:

Но args, передаваемые моей функции - не уничтожаю.

А ты уверен, что твою функцию не считают "крадущей" ссылки? Кто и где ее вызывает?

Кстати, нашел еще несколько интересных ссылок по теме (раз, два, три).

Edited by GPCracker
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...