Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2008, 00:47   #11
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Вообщем ладно, походу никто ничего не понял что я хотел сделать.
Поняли, поняли. Просто руки не дошли поэкспериментировать, а советовать вслерую как-то не хочется. А выкинуть из dll-ки классы, особенно борландовские, по-моему, мысль очень здравая.


Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
..........вопрос, после этого не будет утечки памяти строки GetName которая вернулась...
А это как сказать, в примере Вы на константу указатель возвращаете, тут-то ей взяться неоткуда, а в общем случае придется освобождать, видимо. Наверное, лучше старым проверенным способом: просить API, чтобы он сказал, какой длины буфер ему нужен, выделять, вызывать API, по мере необходимости освобождать, иначе придется еще и соглашение поддерживать на используемую кучу.
B_N вне форума Ответить с цитированием
Старый 09.02.2008, 11:21   #12
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Да тема памяти так, мне кажется, и не раскрыта... Например в ходе работы с плагинами создаются окна множественные вызовы new() - выделения памяти под описанную структуру типа PType = ^TType; TType = packed record ... end; После таких вызовов ( создания окон ) гдет так раз 50 в диспетчере наблюдаю повышения памяти занимаимое моей прогой увеличилось гдет на 5 мб после удаления этих созданных окон и выгрузки длл память уменьшается НО то значение памяти, которе было до создания окон, хоть и после удаления этих самых окон увеличилось на ~800 кб почему так... я незнаю, хотя тем модулем который я представил выше говорит что всего несколько байт теряется, так и должно быть ? Незнаете ?
BOBAH13 вне форума Ответить с цитированием
Старый 09.02.2008, 17:37   #13
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Здесь, я думаю, вопрос состоит в том, как работает диспетчер памяти дельфи и в специфике проецирования DLL на память процесса. Если уверены в том, что память везде обсвобождается правильно, предлагаю рассмотреть такой кусочек {сорри за C }

Код:
#define _MAP_SIZE_	(1024 * 1024 * 10)
#define _HEAP_SIZE_ (1024 * 1024 * 10)
#define _VM_SIZE_	(1024 * 1024 * 10)


	HMODULE					hShell32Dll = NULL;
	HANDLE					hMap = NULL;
	LPVOID					pMapStart = NULL;
	LPVOID					pHeapBuf = NULL;
	LPVOID					pVMBuf = NULL;

	SIZE_T					sizetBeforeLoad;
	SIZE_T					sizetWithDll;
	SIZE_T					sizetAfterUnload;

	SIZE_T					sizetBeforeMapping;
	SIZE_T					sizetWithMap;
	SIZE_T					sizetAfterMapping;

	SIZE_T					sizetBeforeHeapAlloc;
	SIZE_T					sizetWithHeapAlloc;
	SIZE_T					sizetAfterHeapFree;

	SIZE_T					sizetBeforeVMAlloc;
	SIZE_T					sizetWithVMAlloc;
	SIZE_T					sizetAfterVMFree;


	PROCESS_MEMORY_COUNTERS pmc;

	// dynamic link
	GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS));
	sizetBeforeLoad = pmc.WorkingSetSize;

	hShell32Dll = LoadLibrary("shell32.dll");
	GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS));
	sizetWithDll = pmc.WorkingSetSize;

	FreeLibrary(hShell32Dll);
	GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS));
	sizetAfterUnload = pmc.WorkingSetSize;


	// sections
	GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS));
	sizetBeforeMapping = pmc.PagefileUsage;

	hMap = CreateFileMapping(NULL, NULL, PAGE_READWRITE | SEC_COMMIT, _MAP_SIZE_, _MAP_SIZE_, NULL);
	pMapStart = MapViewOfFile(hMap, FILE_MAP_WRITE,0, 0, _MAP_SIZE_);
	GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS));
	sizetWithMap = pmc.PagefileUsage;

	UnmapViewOfFile(pMapStart);
	CloseHandle(hMap);
	GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS));
	sizetAfterMapping = pmc.PagefileUsage;


	// heap
	GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS));
	sizetBeforeHeapAlloc = pmc.WorkingSetSize;

	pHeapBuf = HeapAlloc(GetProcessHeap(), 0, _HEAP_SIZE_);
	GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS));
	sizetWithHeapAlloc = pmc.WorkingSetSize;

	HeapFree(GetProcessHeap(), 0, pHeapBuf);
	GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS));
	sizetAfterHeapFree = pmc.WorkingSetSize;

	// virtual memory
	GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS));
	sizetBeforeVMAlloc = pmc.PagefileUsage;

	pVMBuf = VirtualAlloc(NULL, _VM_SIZE_, MEM_COMMIT, PAGE_READWRITE);
	GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS));
	sizetWithVMAlloc = pmc.PagefileUsage;

	VirtualFree(pVMBuf, 0, MEM_RELEASE);
	GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS));
	sizetAfterVMFree = pmc.PagefileUsage;


#undef _VM_SIZE_
#undef _HEAP_SIZE_
#undef _MAP_SIZE_
После первого прохода картина такая:
Код:
sizetBeforeLoad			3461120	
sizetWithDll			3911680	
sizetAfterUnload		3784704	
sizetBeforeMapping		1003520	
sizetWithMap			1003520	
sizetAfterMapping		1003520	
sizetBeforeHeapAlloc	3792896	
sizetWithHeapAlloc		3801088	
sizetAfterHeapFree		3796992	
sizetBeforeVMAlloc		1003520	
sizetWithVMAlloc		11501568	
sizetAfterVMFree		1003520
Т.е. создается впечатление, что память теряется, причем именно динамическая, виртуальная восстанавливается полностью, но зато в последующих проходах числа совсем не изменяются!
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка собственной ОС BOBAH13 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 150 31.12.2020 15:14
Разработка софта BlackOmen Фриланс 5 20.04.2008 22:34
Разработка проекта [Smarik] Софт 1 08.04.2008 17:22
Plugin и все что с этим связано Mitriy Win Api 9 13.12.2007 10:53
РАЗРАБОТКА DLL Leo Общие вопросы Delphi 2 26.10.2007 21:35