2016-11-24 4 views
2

Я хочу использовать std::shared_ptr и std::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 code ...

+0

Я бы перечислил («центральное» хранилище), чтобы сохранить право собственности, иначе я могу использовать std :: unique_ptr и получить необработанный указатель с методом .release(). – seam

+0

, когда вам нужно получить доступ к определенному фрагменту через необработанный указатель позже после первоначального выделения, это не всегда на обратной стороне! Поэтому некоторое индексирование используется в сообщении OP. – lorniper