做一个dll,在这个dll中我用new给变量分配了内存。然后显示调用这个dll,当freeLibrary时,也同时把new分配的内存释放掉了,这正常吗? 做一个dll,在这个dll中我用new给变量分配了内存。然后显示调用这个dll,当freeLibrary时,也同时把new分配的内存释放掉了,这正常吗?如果正常,该怎么分配内存,分配好的内存在freeLibrary时释放不掉。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 非常正常看这个我以前写的一个串口通讯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之外的地方释放,否则会破坏堆栈导致程序崩溃。 视频服务器中的包大小设置? 如何使菜单变灰? win32 下如何改变控件背景色 还是取不到IE地址栏的文本 请问如何生成一个随机数(8位的)? 求windows服务程序的简短例子(100分) 怎样用菜单选择同一数据源不同的表进行操作?(明天要交差了) VC++ 通讯录! 使用COM来向IIS网站发http请求,服务端会产生session不。我知道用浏览器打开http会产生session 不会发布VC程序 网络捕获的免费工具提供。 _variant_t和_bstr_t区别?
可以很好的在进程和线程间使用!!!!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);
}第一次进程载入时也要调用线程载入,因为一个进程是就是一个线程!