C/C++ extended python時一種常見的內存泄漏

C/C++ extended python時一種常見的內存泄漏

比如像這樣的代碼:

PyObject *dic = PyDict_New();
iret = PyDict_SetItem(dic, Py_BuildValue("s","xxxxxx"),Py_BuildValue("s"), "Hello xxxx");

這樣就會出現內存泄漏!

正確的寫法應該是這樣:

PyObject *dic = PyDict_New();
PyObject *obj1 = Py_BuildValue("s","xxxxxx");
PyObject *obj2 = Py_BuildValue("s", "Hello xxxx");
iret = PyDict_SetItem(dic, obj1, obj2);
Py_XDECREF(obj1);
Py_XDECREF(obj2);

還有一種寫法就會導致coredump

PyObject *dic = PyDict_New();
PyObject *obj1 = Py_BuildValue("s","xxxxxx");
PyObject *obj2 = Py_BuildValue("s", "Hello xxxx");
Py_XDECREF(obj1);
Py_XDECREF(obj2);
iret = PyDict_SetItem(dic, obj1, obj2);

其實想想是正確的行爲:python obj是通過reference來控制生命週期的。如果一次c/++ API某些obj引用計數不爲0就返回了。這些對象就會一直存在python虛擬機裏面。python虛擬機本來也不該回收他們。

最後一種情況就更好理解了,訪問一個已經回收的地址當然就會coredump咯

順帶說說測試辦法:1.測試內存泄漏就是調大返回數據,for多次調用。top看見內存在不停的增加就是內存泄漏了。

  1. 長時間運行,覆蓋測試可以發現這個問題。

Author: 駱志輝<[email protected]>

Date: 2012-06-29 00:02:19 CST

HTML generated by org-mode 6.33x in emacs 23

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章