我正在C++中開發貝葉斯推理採樣器,它在樹上中繼很多,並且這個樹是在智能指針(Boost的shared_ptr和weak_ptr)的幫助下實現的。Boost shared_ptr不會立即銷燬對象
在推斷過程中(即運行一個長時間的C++函數1-2分鐘),樹被改變很多,創建並銷燬了許多節點。
完全推理過程(100%負載)佔用處理器(更精確地說,它是一個線程)。出於某種原因,新內存(對於新節點)正在被佔用,但舊內存不會被完全釋放,這會在內存溢出1-2分鐘後導致內存溢出。
雖然,如果我在推理過程中添加暫停,程序似乎完全銷燬舊對象,並且一切正常。
在我看來,原因是析構函數(或者更準確地說,它後面發生的事情,即內存釋放)由於某種原因而被延遲。
請問:請問: 1)這看起來是一個真正的問題嗎? 2)如果是,那麼等待「足夠的內存」被釋放時如何更好?什麼是標準策略?
(該程序正在被在Unix上運行。)
對我來說,聽起來像你的shared_ptr仍然有引用持有給他們,因此不會被直接銷燬。但說實話,很難說沒有任何代碼。 –
'shared_ptr'只是調用'delete'。你確定觀察到的行爲不是由於「刪除」?因爲'刪除'實現是已知的,它推遲了實際的處理,假設他們可以回收分配。 – MSalters
MSalters,你可以給出一個關於刪除實現的信息,並推遲釋放嗎?我認爲這可能是我的情況。 (對不起,還沒有找到我自己。) –