![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Каким образом проще реализовать хранилище указателей? 
		
	
		
		
		
		
			
		
		
		
		
		
			Проблема в том, что выделяется память в локальные переменные, а при завершении работы всего алгоритма она не прибивается (ибо по смыслу программа должна была завершиться забив на освобождение памяти). Из-за этого подтекает память и алгоритм не совсем верно работает при втором проходе. Кроме как сделать вектор или двусвязный список, чето в голову ничего не приходит (но под них тоже надо будет память (пере)выделять, а это лишние тормоза (если только чанками выделять)). Последний раз редактировалось M.A.D.M.A.N., 07.04.2013 в 22:56.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Самое простое, имхо - сделать таблицу, вида 
		
	
		
		
		
		
			
		
		
		
		
		
			<адрес><размер><флаги>|<адрес><размер><флаги>|<адр ес><размер><флаги>|<адрес><размер><флаги>... Во флагах будет обозначено, занят фрагмент или свободен. При выделении - ищем либо свободный блок равного размера и его занимаем, либо отрезаем кусок от большего блока и помечаем как занятый. При освобождении - ставим флаг "свободно" и сливаем с соседними свободными. Таблица относительно небольшая, и при этом может описывать довольно много блоков. При этом происходит много копирований этой таблицы, но зато просто в реализации. Разумеется, когда таблица кончится - придется выделять новое место для нее. Где-то год или полтора назад я упоролся и сделал такой менеджер на асм. Пока вроде работает. Хотя конечно, никакой оптимизацией тут и не пахнет. Еще вариант - нарыл в инете простенький менеджер heappie. Он пошустрее будет наверно, но он на плюсах и в его код я особо не вникал. В любом случае, принцип менеджера примерно одинаков всегда. И в том, и в другом случае, от оси выделяется большой кусок, потом работаем внутри него. Не знаю как в хиппи, а в моем алгоритме можно запросто пройтись по таблице и освободить всё нафиг. З.Ы. если надо просто хранить указатели - то проще всего сделать вектор и битовую маску к нему. Стерли - сняли бит, при поиске смотрим свободное место для записи или дописываем в конец. Выделяем сразу много и перевыделять скорее всего не придется. Последний раз редактировалось Bargest, 07.04.2013 в 23:08.  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Поторопился я с созданием темы. 
		
	
		
		
		
		
			
		
		
		
		
		
			В общем там память только выделяется, за прибиванием никто не отслеживает, так, что думаю простого выделения кусмана памяти и запись туда указателей на выделенную память будет вполне достаточно. Потом просто в цикле идти и вызывать LocalFree со значениями из этого кусмана. Спасибо за ответ, посмотрю хиппи. Код: 
	foo: Cardinal; begin foo := LocalAlloc(LMEM_ZEROINIT, 1024); lstrcpyA(PAnsiChar(foo), 'qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq'); foo := LocalReAlloc(foo, 2048, LMEM_MOVEABLE); Последний раз редактировалось M.A.D.M.A.N., 08.04.2013 в 08:54.  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Из-за чего может выводиться: 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Цитата: 
	
 Вроде везде только LocalAlloc/LocalFree.  |