我正在處理mex文件中的一些內存,並將句柄傳回給matlab。有沒有辦法處理用戶清除或刪除存儲在matlab變量中的特定句柄的事件,我知道它也可以在mex文件中刪除。如何在matlab中銷燬變量時,如何銷燬mex文件中的內存?
回答
聽起來就像您試圖將MEX層內管理的分配的生命週期鏈接到正在使用它們的M代碼級結構的生命週期。您可能想要將這些原始uint64
句柄值封裝在支持清理回調的Matlab數據結構中。
您可以將它們包裝在您定義的Matlab的handle
子類中,併爲其指定一個delete
方法,該方法可以調用ocl_mex
來執行相應的清理。 Delete
是一個析構函數,當從Matlab工作空間中清除了對象的最後一個副本時,它將自動被調用。 (一旦你使用了對象,你可以提供對應於各種ocl_mex調用形式的更簡潔的方法,更好的顯示方式,或許使用運算符重載乘法的語法,等等。)詳見http://www.mathworks.com/help/matlab/matlab_oop/handle-class-destructors.html。這可以很好地工作,如果你然後使mex函數在類中的私有函數。使您可以輕鬆地在您的mex訪問中添加調試日誌記錄和完整性檢查等。
代碼可能看起來有點像這樣。
class ocl < handle
properties (SetAccess = private)
ocl_handle # the raw uint64 handle the MEX layer works with
end
methods
function out = ocl(mex_handle) # maybe make this private
out.ocl_handle = mex_handle;
end
function delete(obj)
if ~isempty(obj.ocl_handle)
ocl_mex(obj.ocl_handle, 'cleanup');
end
end
function out = mat_mult(A, B)
handle_c = ocl_mex('mat_mult', A.ocl_handle, B.ocl_handle);
out = ocl(handle_c); # And now the new handle has a cleanup hook, too...
end
end
methods (Static = true)
function out = allocate(some_args)
new_handle = ocl_mex([], 'allocate', some_args);
out = ocl(new_handle);
end
end
end
如果你想避免使用類,你也可以把它們粘在一個普通的結構,並使用onCleanup
創建時的最後一個副本被清除自動被調用的回調。
問題是你必須確保對句柄的所有訪問都通過對象或結構,並且沒有東西彈出來並「泄漏」原始句柄值。更容易執行對象。
這就是我真正想要的第一個地方,但找不到我在找什麼。我在我的mex上創建了清理方法,但我的問題是如果用戶刪除了句柄,他無法調用清理。謝謝我將使用這種方法。 – 2013-03-18 10:54:11
- 1. 銷燬ruby中的變量
- 2. 如何銷燬AIDL存根?
- 3. 如何銷燬NSHTTPCookies?
- 4. 如何銷燬tinyMce?
- 5. 線程被銷燬時,變量是否被銷燬?
- 6. 在clojure銷燬變量
- 7. 如何銷燬組件銷燬的反應FormControl?
- 8. 父母被銷燬時如何銷燬子對象?
- 9. 在C中銷燬變量或數組#
- 10. 銷燬會議變量註銷
- 11. Powershell splat銷燬變量
- 12. Android:onBackPressed()銷燬所有內存?
- 13. 如何在jQuery中銷燬$ .animate函數?
- 14. 如何在symfony 2.6中銷燬會話?
- 15. 如何在java中銷燬進程
- 16. 銷燬控件
- 17. 如何銷燬cytoscape.js實例
- 18. 如何銷燬java對象?
- 19. 如何銷燬,團結
- 20. 如何銷燬heatmap.js實例?
- 21. 如何銷燬PDFJS對象?
- 22. 如何正確銷燬AsyncTasks?
- 23. 如何自動銷燬QMediaPlayer?
- 24. Android - 如何銷燬BroadcastReceiver?
- 25. 銷燬Dijit中的微件
- 26. 如何銷燬C#中的COM對象?
- 27. 如何銷燬firebase-admin中的idToken?
- 28. 如何銷燬Android中的活動?
- 29. 何時致電YUI銷燬?
- 30. angular2銷燬視圖銷燬訂閱
您能否提供更多信息?通常你自己將參數傳遞到mex文件中,以便在調用mex函數之前測試它們是否與exist()函數一起存在。 – Justin 2013-03-16 18:59:33
我在GPU上分配一些內存並返回一個指向matlab的指針。在matlab中,這顯示爲X具有一些uint64值。如果我在matlab中刪除X.內存仍然分配在GPU上。我想在用戶刪除或覆蓋matlab中的變量X時觸發某種方法。 – 2013-03-16 19:26:47
因此,在mex文件返回指向gpu上的內存的指針之後,如何在gpu中的內存上進行算術運算?你叫另一個mex功能嗎? – Justin 2013-03-16 19:47:03