Tôi chỉ đang cố gắng hiểu cách xử lý số lượng tham chiếu khi sử dụng API C C.API C C Python, Số lượng tham chiếu cao cho Đối tượng mới
Tôi muốn gọi một hàm Python trong C++, như thế này:
PyObject* script;
PyObject* scriptRun;
PyObject* scriptResult;
// import module
script = PyImport_ImportModule("pythonScript");
// get function objects
scriptRun = PyObject_GetAttrString(script, "run");
// call function without/empty arguments
scriptResult = PyObject_CallFunctionObjArgs(scriptRun, NULL);
if (scriptResult == NULL)
cout << "scriptResult = null" << endl;
else
cout << "scriptResult != null" << endl;
cout << "print reference count: " << scriptResult->ob_refcnt << endl;
Các Python mã trong pythonScript.py rất đơn giản:
def run():
return 1
Các tài liệu về "PyObject_CallFunctionObjArgs" nói rằng bạn nhận được một tham chiếu mới là giá trị trả về. Vì vậy, tôi mong chờ "scriptResult" để có một số tài liệu tham khảo của 1. Tuy nhiên, sản lượng là:
scriptResult != null
print reference count: 72
Hơn nữa tôi mong chờ một rò rỉ bộ nhớ nếu tôi làm điều này trong một vòng lặp mà không làm giảm tính tham khảo. Tuy nhiên điều này dường như không xảy ra.
Ai đó có thể giúp tôi hiểu không?
Trân trọng!
Câu hỏi tiếp theo: Cảm ơn @ecatmur và @KayZhu Tôi giờ đã hiểu tại sao không có rò rỉ bộ nhớ. Tuy nhiên nếu tôi chạy mã này trong một vòng lặp dài os hoàn thành của tôi nghiền nát anyway. Số tham chiếu đến '1' đang tăng lên, mỗi lần lặp lại, nhưng tôi không thấy lý do tại sao điều này sẽ gây ra lỗi hệ thống. – user1774143
Bạn đang lặp cho đến khi chu kỳ 'ob_refcnt' quay lại 0? Số lượng tham chiếu của 1 biến động rất nhiều. Khi bạn quấn xung quanh 0, các hoạt động bình thường có thể 'Py_DECREF' thành 0 và khiến' int' 1 bị deallocated, theo sau bởi một segfault. Hãy thử nó với một ít int interned 'int' như 13. – eryksun
Ít nhất, tôi thậm chí không looping cho đến khi 'sys.maxint' (đó là '9223372036854775807' trên hệ thống của tôi). Hôm nay có vẻ như tôi không thể tạo lại lỗi và tôi đoán tôi nên ngừng cố gắng quay máy tính để bàn làm việc của mình xuống. Cảm ơn bạn đã giúp đỡ! – user1774143