nAlex
Зарегистрирован: 29.08.2005 Сообщения: 1
|
Добавлено: Пн Авг 29 2005 16:40 Заголовок сообщения: освобождение памяти функциями экспортируемыми с DLL-библиоте |
|
|
Вопрос:
Если кто-то с талкивался с этим, помогите пожалуйста.
Суть во всем этом такая. Есть массив в нашем слечае "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-приложений". |
|