Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

освобождение памяти функциями экспортируемыми с DLL-библиоте

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
nAlex



Зарегистрирован: 29.08.2005
Сообщения: 1

СообщениеДобавлено: Пн Авг 29 2005 16:40    Заголовок сообщения: освобождение памяти функциями экспортируемыми с DLL-библиоте Ответить с цитатой

Sad
Вопрос:
Если кто-то с талкивался с этим, помогите пожалуйста.
Суть во всем этом такая. Есть массив в нашем слечае "cbuff" если выделять память в основной проге, а птом вызывать функцию "ReAllocMem()" с DLL`ки в которой выделяется новый массивб копируется содержимое старого, удаляется старый массив и указателю "cbuff" присваивается адресс нововыделенного участка памяти, то при этом возникает ошибка при удаление памяти, которая была выделення в основной проге. ЕСЛИ же выделять изначально память в DLL-ке, тогда все нормально.
Учет выделенной памяти ведется полюбому, НО проблема в том что из DLL-ки ее есвободить не получится, хотя казалось-бы адрессное пространство одно 8(.
Ладно, хватить сказок. Помогите кто с этим сталкивался или знает что к чему.

Вот текст осн. проги:-----------------------------------------------------------

#include <windows.h>

HMODULE hmDLL;

int (*Add)(int* buff, int size, TswapBuffer<int>* b);
char* (*AllocMem)(char* buff, int size);
void (*FreeMem)(char* buff);
char* (*ReAllocMem)(char* buff, int size, int new_size);

char* cbuff=NULL;

int main()
{
if((hmDLL=LoadLibrary("..\\dllproc\\Debug\\dllproc.dll"))!=NULL){
if( (Add=(int(*)(int*, int, TswapBuffer<int>*))GetProcAddress(hmDLL,"Add"))!=NULL &&
(AllocMem=(char*(*)(char*, int))GetProcAddress(hmDLL,"AllocMem"))!=NULL &&
(FreeMem=(void(*)(char*))GetProcAddress(hmDLL,"FreeMem"))!=NULL &&
(ReAllocMem=(char*(*)(char*, int , int))GetProcAddress(hmDLL,"ReAllocMem"))!=NULL ){

//1 cbuff=AllocMem(cbuff, 100);
//2 cbuff=new char[100];
cbuff=ReAllocMem(cbuff, 100, 110);
FreeMem(cbuff);

FreeLibrary(hmDLL);
}
}
return 0;
}

А это DLL-ки:--------------------------------------------------------------------

#include <windows.h>

#if defined(__cplusplus)
extern "C"{
#endif
__declspec(dllexport) char* AllocMem(char* buff, int size);
__declspec(dllexport) void FreeMem(char* buff);
__declspec(dllexport) char* ReAllocMem(char* buff, int size, int new_size);
#if defined(__cplusplus)
}
#endif


int Add(int* buff, int size, TswapBuffer<int>* b)
{
for(int i=0; i<size; i++)
b->Add(buff[i]);

return 0;
}


char* AllocMem(char* buff, int size)
{
buff=new char[size];
for(int i=0; i<size; buff[i]=i++);
return buff;
}


void FreeMem(char* buff)
{
delete[] buff;
}

char* ReAllocMem(char* buff, int size, int new_size)
{
char* tmp_buff=new char[new_size];
for(int i=0; i<size; i++)
tmp_buff[i]=buff[i];
delete[] buff;
return (buff=tmp_buff);
}


// DLL entry point
bool WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved)
{
return 1;
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Domanser



Зарегистрирован: 03.08.2005
Сообщения: 4
Откуда: Киев

СообщениеДобавлено: Чт Сен 01 2005 15:22    Заголовок сообщения: Ответить с цитатой

Это распространенная ошибка. У DLL-ки своя статически прилинкованная C/C++ библиотека, а у вашего приложения - своя. Поэтому и кучи разные. Нужно либо управлять динамической памятью только в одном модуле (точнее, для одного блока памяти не смешивать, как вы делаете), либо использовать только динамически подключаемую C/C++ библиотеку.

Об этом рассказывает Джеффри Рихтер в книге "Создание эффективных Win32-приложений".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...