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看見內存在不停的增加就是內存泄漏了。
- 長時間運行,覆蓋測試可以發現這個問題。
Date: 2012-06-29 00:02:19 CST
HTML generated by org-mode 6.33x in emacs 23