無法找出發生了什麼問題。使用大量的unique_ptr後釋放內存到os - C++
下面是一個簡單的代碼
size_t n_elem = 30000000; //careful! will allocate 1GB with unique_ptr
vector<unique_ptr<double> > tmp;
tmp.resize(n_elem);
for(size_t i=0; i<n_elem; i++){
tmp[i] = unique_ptr<double>(new double((double)i));
}
tmp.clear();
//Some answers in Stack overflow seems to suggest this technique to force
//freeing, but does not seem to work.
vector<unique_ptr<double> > tmp1;
tmp.swap(tmp1);
當此完成。當系統監視器顯示內存使用率高峯時,系統監視器仍然顯示948 MB的分配情況,然後將所有內容都釋放正確。即使該代碼段被括在括號{...}中以確保範圍,但我沒有看到任何改進。內存分配後,它似乎不會釋放,直到程序結束。
懷疑與矢量的東西,我嘗試了下面的代碼,但具有相同的行爲。
{
size_t n_elem = 30000000;
unique_ptr<double>* tmp = new unique_ptr<double>[n_elem];
for(size_t i=0; i<n_elem; i++)
tmp[i] = unique_ptr<double>(new double((double)i));
delete[] tmp;
}
然而,
size_t n_elem = 30000000;
double *d_tmp;
d_tmp = new double[n_elem];
for(size_t i=0; i<n_elem; i++)
{
d_tmp[i] = (double)i;
}
delete[] d_tmp;
此代碼顯示的存儲器使用量上升至約260 MB和作爲陣列被刪除,則減小。
我試着用類而不是double來計算析構函數被靜態變量調用的次數。在這兩種情況下,析構函數被稱爲正確的次數。
我無法弄清楚我使用unique_ptr的方式有什麼問題,以及爲什麼在銷燬後沒有返回分配給操作系統的內存。 cpp參考似乎暗示這會在uniue_ptrs被破壞時自動發生。我如何讓unique_ptr釋放已分配的內存並將其返回給操作系統?
這發生在gcc 4.6與Ubuntu 12.04和qtcreator qt項目。
您正在創建兩個unique_ptr數組,並且只刪除一個? – yngccc
@yngum,不,即使在第二個代碼片段中也會出現問題。片段獨立運行。第一個片段用當前向量交換一個空向量。 – sri
第二個片段還會爲每個元素創建兩個unique_ptr – yngccc