[C++] Проблемы с памятью при обмене EXE<>DLL
#1
Отправлено 24 февраля 2006 - 11:04
#4
Отправлено 24 февраля 2006 - 22:59
Если линковать его статически (/MT), то у каждого проекта, у exe и у dll будут свои экземпляры кода менеджера памяти со своим мнением о состоянии кучи, и менеджер памяти, прилинкованный к экзешнику, не будет знать о том, что делает менеджер памяти, прилинкованный к библиотеке. А если сам менеджер памяти будет располагаться в отдельной дллке (/MD), то оба твоих модуля будут использовать один и тот же его экземпляр.
В общем, идея в том, чтобы выделение и освобождение куска памяти происходило в одном и том же месте. Если этого нельзя добиться на уровне своего кода (т.е. чтобы все выделять и освобождать либо только в exe, либо только в dll), остается сделать это на уровне runtime библиотеки.
#5
Отправлено 03 марта 2006 - 20:44
#7
Отправлено 03 апреля 2006 - 17:48
Поэксперементировал с с различными типами линковки, но результат остался прежним, память не удаляется. В ексешнике по дефолту стоит /MD (другой поставить не даёт), если в dll стоит /МТ, то ошибки выделения/удаления памяти выражаются сразу в виде фатальных ошибок, если /MD, то ошибки вылетают не сразу, но проведя тесты, я увидел, что память не освобождается, что позже, после переполнения кучи, тоже вызывает ошибки.Какие еще примеры реализации? Все в стандартной библиотеке. Просто прилинкуй ее правильно.
Заморачиваться со своим собственным менеджером памяти -- это я даже так сразу и не придумаю, для каких целей...
ПС Спасибо, что хоть ты мне отвечаешь.
#12
Отправлено 07 июля 2006 - 17:50
Да я тоже думал о том, чтобы переделать структуру проги как-нибудь так, чтобы память где выделялась, там бы и удалялась... Но видимо я слишком поздно сообразил Уже наверное будет проще всё с нуля переписать... Просто когда я начал добавлять функционал ДЛЛ-льный, я и понятия не имел, что такие запары могут случится...Тогда не знаю. Разве что переписать код так, чтобы выделение-освобождение в одном месте происходило...
Ну тоже вариант, хотя и грубый... Но если выбора не останется, то придётся наверное заюзать GlobalAllocate, а так не хочется.не совсем в курсе тонкостей реализации менеджера на VC++, но можно попробовать использовать виндозный менеджер и юзать GlobalAllocate. при условии конечно, что структура не динамическая