2016-11-24 155 views
2

我想爲我的問題(內存綁定)使用std::shared_ptrstd::list在處置,請注意,我需要與一些傳統的C代碼,需要原始指針和我的主要目標是讓一種動態內存管理的(可以回收內存只要有可能),我psudo-代碼之後,內存管理與std :: list和std :: shared_ptr

// My "central" storage 
typedef std::shared_ptr<double> data_type; 
std::list<data_type> dynamic_storage; 


// At each allocation point 
dynamic_storage.push_back(data_type()); 
dynamic_storage.back.reset(new double[N],std::default_delete<double[]>()); 


// immediately after each allocation, store the shared_ptr to some map 
std::map<data_type> map_for_job1;    // may have several maps 
int index; // unique index for later access, related to domain-specific problem 
data_type ptr_in_map(dynamic_storage.back()); // reference counter +1 
map_for_job1[index]=ptr_in_map;    // store in map 


// when I want to access again with a certain map and index 
double *raw_data = map_for_job1.find(index).get(); 


// when I'm done with all the resources shared by buffer_map_1 
map_for_job1.clear();  // reference counter -1 
for (std::list<data_type>::iterator it=dynamic_storage.begin(); it != dynamic_storage.end(); ++it) 
{ 
if (*it.use_count()==1) 
dynamic_storage.erase(i) // release resource from central storage 
} 

所以,我的問題是,

  1. 這是一個有效的內存管理模式?
  2. 如何改進,也許遍歷列表太昂貴了?
+1

有多種內存管理模式,所以沒有真正的「有效」你有沒有考慮[使用現有的](http://stackoverflow.com/questions/1194479/write-your-own-memory-manager)? –

回答

1

不能你根本:

std::list< std::vector<data_type> > dynamic_storage; 

然後去:

dynamic_storage.move_back(std::move(std::vector<data_type>(N)); 

當你需要一個指針,使用迭代器或者像你一樣:

data_type* p = &dynamic_storage.back()[0]; 

然後整個事情應該清理掉,因此你不需要任何特定的cl eanup代碼...

+0

我會列表(「中央」存儲)來保留所有權,否則我可以使用std :: unique_ptr並使用.release()方法獲取原始指針。 – seam

+0

當您需要在初始分配後通過原始指針訪問特定塊時,它並不總是在後面!所以在OP的文章中使用了一些索引。 – lorniper

相關問題