作者yuwenche (yuwenche)
看板C_and_CPP
標題[問題] 計算兩個二維陣列的乘積,但無法釋放記
時間Sat Sep 23 09:41:57 2023
底下連結的程式片段是計算兩個二維陣列的乘積,此函式會被編譯成dll檔,供python程
式調用。 目前的情況是能傳回正確的乘積值,但因第45行之後未被執行,也就是宣告的
記憶體空間未被釋放,程式跑久就出現記憶體不足的問題了。請問有沒有辦法傳回正確值
且能釋放記憶體?
https://drive.google.com/file/d/1IdiUiNmFEVAb3AQfoEk3_20MDrDidO2o/view?usp=sharing
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.164.46.142 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1695433319.A.EF9.html
1F:推 LPH66: 注意你 40 行已經 return 了 09/23 10:11
2F:→ LPH66: return 不只是表示什麼是回傳值, 更表示程式執行到此為止 09/23 10:11
3F:→ lycantrope: 不過就算return放在最後一行,這code也是www 09/23 14:37
4F:→ stupid0319: 把結果轉成字串,存在固定空間, python 處理字串 09/23 15:08
5F:→ lycantrope: 直接轉成numpy回傳就好,轉字串不如別用c 09/23 15:59
6F:推 CoNsTaR: 不能在 Python 那邊 allocate 好再把陣列傳進來嗎? 09/23 23:14
7F:→ yuwenche: 感謝各位的建議,雖然此題目前仍無解。只好先用純python 09/26 11:42
8F:→ yuwenche: 來解了,雖然速度上是慢了點。 09/26 11:44
10F:→ yvb: 樓上, 你貼的是本篇文章代碼耶... 09/27 18:22
12F:推 lc85301: 不一樣啦,這次有 python 呀 09/28 00:00
13F:→ tomsawyer: 應該妳得拿到pointer後 又再呼叫一個free 的function 09/29 23:46
14F:→ tomsawyer: 定義在dll裡去釋放他 09/29 23:46
15F:推 closer76: 我有個想法:如果你能在 Python 裡處理這個被回傳的指標 09/30 10:50
16F:→ closer76: 那你能不能再寫一個 C 的函式,專門做 free(),然後在 09/30 10:51
17F:→ closer76: Python 裡呼叫這個函式去釋放記憶體? 09/30 10:51
18F:推 LPH66: 其實樓上的做法不只是給 python, 它甚至是一般寫 DLL 時 09/30 23:16
19F:→ LPH66: 的做法: 當 DLL 有獲取資源的動作時, 一定也有一個釋放資源 09/30 23:17
20F:→ LPH66: 的函數, 這樣需求跟釋放都會在 DLL 裡 09/30 23:17
21F:→ yuwenche: 感謝樓上兩位的意見,其實這方法我也試過,只不過程式在 10/03 18:41
22F:→ yuwenche: 執行時發生錯誤。能把構想程式化嗎? 如果對python不熟, 10/03 18:45
23F:→ yuwenche: 就在C語言的main()中調用即可,感謝。 10/03 18:47
24F:→ lycantrope: 先學寫C再去想python,再說有numpy為何不用 10/03 21:58