做一个dll,在这个dll中我用new给变量分配了内存。然后显示调用这个dll,当freeLibrary时,也同时把new分配的内存释放掉了,这正常吗?如果正常,该怎么分配内存,分配好的内存在freeLibrary时释放不掉。
我认为是正常的.
你这个要求恐怕不能实现吧?
我认为是正常的.
非常正常
看这个我以前写的一个串口通讯DLL!!!
可以很好的在进程和线程间使用!!!!
DWORD dwTlsIndexComm = 0xFFFFFFFF;
BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
LPVOID lpvReserved)
{
LPVOID lpvData;
BOOL fIgnore;
switch (fdwReason)
{
case DLL_PROCESS_ATTACH: //被进程载入
if (0xFFFFFFFF == (dwTlsIndexComm = TlsAlloc()))
{
return FALSE;
}
case DLL_THREAD_ATTACH: //被线程载入
lpvData = (LPVOID) LocalAlloc(LPTR, sizeof(PHANDLE));
if (lpvData != NULL)
{
fIgnore = TlsSetValue(dwTlsIndexComm, lpvData);
}
break;
case DLL_THREAD_DETACH: //线程退出
lpvData = TlsGetValue(dwTlsIndexComm);
if (lpvData != NULL)
{
LocalFree((HLOCAL) lpvData);
}
break;
case DLL_PROCESS_DETACH: //进程退出
lpvData = TlsGetValue(dwTlsIndexComm);
if (lpvData != NULL)
{
LocalFree((HLOCAL) lpvData);
}
TlsFree(dwTlsIndexComm);
break;
default:
break;
}
return TRUE;
UNREFERENCED_PARAMETER(hinstDLL);
UNREFERENCED_PARAMETER(lpvReserved);
}
第一次进程载入时也要调用线程载入,因为一个进程是就是一个线程!
我认为,dll中用的是虚拟内存,一旦dll退出,整个虚拟内存的架构都不在了,在其中分配的内存还能存在吗?
在DLL中分配的内存必须在该函数结束的时候释放,否则会造成内存泄漏
每个DLL都有自己的堆栈,在DLL里分配内存是从DLL自己的堆里分配,所以DLL被卸载的时候分配的内存也一起被卸载掉了。另外从DLL里分配的内存也不可以在DLL之外的地方释放,否则会破坏堆栈导致程序崩溃。