亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Python Api 在 C 中實現的二叉樹將 PyObject 轉換為字節

使用 Python Api 在 C 中實現的二叉樹將 PyObject 轉換為字節

慕神8447489 2023-03-16 11:26:22
我的 PyObject 在獲取它的值時變成了一個 Bytes 對象所以最近,我正在用 C 做一個項目,我在其中實現了幾種類型的樹,以便能夠在 python 中使用它們,因為 C btree 實現比 Python 快得多。(Ikr 有一些可用的庫,但由于在鎖定期間我有更多的空閑時間,我想,我可以做我自己的庫。)一切正常,直到我想找到一個元素,并在同一行打印它的值。當我這樣做時,我的Node對象變成了一個Bytes對象,沒有任何進一步的賦值。更多信息操作系統:Ubuntu 16.04。Python 版本:Python 3.5.2GCC:5.4.0-6 Ubuntu蟒蛇代碼:import mylibimport randommaxv = 10def addValues(tree, values):    for value in values:        tree.insert(value)def main():    my_list = [i for i in range(maxv)]    #random.shuffle(my_list)    tree    = mylib.BinaryTree('test')    addValues(tree, my_list)    print(tree.find(3).getValue())    print(tree.sort(False))    main()預期輸出(如果主函數中最后一行之前的行是有效的print(tree.find(3))):3[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]我用上面的測試代碼得到的輸出:3Segmentation fault發生分段錯誤,因為包含值的節點在打印其值時3成為Bytes對象。下面的代碼將打印新的Node.import mylibimport randommaxv = 10def addValues(tree, values):    for value in values:        tree.insert(value)def main():    my_list = [i for i in range(maxv)]    #random.shuffle(my_list)    tree    = mylib.BinaryTree('test')    addValues(tree, my_list)    print(tree.find(0).getValue()) #0 is going to be the root node's value, since random.shuffle is not happening.    print(tree.root)    print(tree.sort(False))    main()輸出:0b'0'Segmentation fault我花了幾天時間對此進行調試,而且由于我絕對不是 C 編程高手,(您將在下面看到),我找不到錯誤。我想繼續,并實現更多功能,但我無法找到錯誤。我有可能錯過了一些如此微不足道的事情,或者我不知道的事情。遺憾的是,我不是經驗豐富的 C 程序員。:/我的模塊包含更多代碼,我不會發布這個問題不需要的代碼。如果您認為應該多看一些以理解我的代碼,請隨時告訴我!我也希望我的代碼可讀性好!有人可以解釋到底發生了什么嗎?謝謝你!
查看完整描述

1 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

正如評論中所討論的那樣,這是一個引用計數錯誤。AC API 函數必須返回 Python 所稱的“新引用”。這意味著要么返回在函數內部有意創建的內容(例如 的結果PyList_New)以增加現有對象的引用計數。

具體來說BinaryTree_Find,您沒有返回新的參考。因此,Python 最終會釋放一個仍然構成 BinaryTree 一部分的對象。一旦發生這種情況,您可能會遇到各種奇怪且令人困惑的行為。我建議添加Py_INCREF(result).

為了幫助診斷此類問題,值得printf向對象構造函數和析構函數添加語句(作為臨時調試措施),這樣您就可以檢查有關何時分配和釋放它們的假設。


查看完整回答
反對 回復 2023-03-16
  • 1 回答
  • 0 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號