我有一個 C++ 類,它將 Python 模塊作為文件導入,并在返回接收到的數據之前連續調用它的函數:ProgramLiveProcess::ProgramLiveProcess() { //Start Python to run the Program Python code Py_Initialize(); //Import the Program live processing module program_live_processing_module = PyImport_ImportModule(MODULE_NAME); //Get the objects for the functions to call live_process = PyObject_GetAttrString(program_live_processing_module, "Program_LiveProcess");}//Creates Python list from intensities arrayPyObject* ProgramLiveProcess::get_intensities_list(unsigned int intensities[INTENSITIES_DATA_SIZE]) { PyObjec* tr = PyList_New(0); for (int i = 0; i < INTENSITIES_DATA_SIZE; i++) { PyObject* ta = PyLong_FromLong(intensities[i]); PyList_Append(tr, ta); } return tr;}//TODO: Make this actually work//Frees objects in intensities Python list and the list itselfvoid ProgramLiveProcess::free_intensities_list(PyObject* i_list) { //std::cout << std::to_string(i_list->ob_refcnt) << std::endl; for (int i = 0; i < INTENSITIES_DATA_SIZE; i++) { PyObject* ta = PyList_GET_ITEM(i_list, i); Py_DECREF(ta); } Py_DECREF(i_list);}processed_data* ProgramLiveProcess::send_to_program_live_process(unsigned int intensities[INTENSITIES_DATA_SIZE], bool use_sensor_1) { //Call the Program_LiveProcess function PyObject* intensities_py = get_intensities_list(intensities); PyObject* calculate_args = PyTuple_Pack(2, intensities_py, use_sensor_1 ? Py_True : Py_False); //True or false depending on if using sensor 1 or 2 PyObject* processed_data_tuple = PyObject_CallObject(live_process, calculate_args); Py_DECREF(calculate_args); free_intensities_list(intensities_py); //Get the data from the function PyObject* s0p = PyTuple_GetItem(processed_data_tuple, 0); PyObject* s0t = PyTuple_GetItem(processed_data_tuple, 1);}雖然程序接收數據很好,但在不同條件下運行時,我在內存泄漏和崩潰方面遇到了不一致的情況。雖然我無法提供堆棧跟蹤,但我想知道我在創建或取消引用 Python 對象方面是否做錯了什么。通常,程序僅在我注釋掉 free_intensities_list 調用時運行。
1 回答

動漫人物
TA貢獻1815條經驗 獲得超10個贊
在你的free_intensities_list
函數中,你可能會進行雙重釋放。考慮使用Py_XDECREF
代替。
void?Py_DECREF(PyObject?*o) Decrement?the?reference?count?for?object?o.?The?object?must?not?be?NULL;?if?you?aren’t?sure?that?it?isn’t?NULL,?use?Py_XDECREF().?If?the?reference?count?reaches?zero,?the?object’s?type’s?deallocation?function?(which?must?not?be?NULL)?is?invoked.
添加回答
舉報
0/150
提交
取消