做一个dll,在这个dll中我用new给变量分配了内存。然后显示调用这个dll,当freeLibrary时,也同时把new分配的内存释放掉了,这正常吗?如果正常,该怎么分配内存,分配好的内存在freeLibrary时释放不掉。

解决方案 »

  1.   

    非常正常看这个我以前写的一个串口通讯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); 
    }第一次进程载入时也要调用线程载入,因为一个进程是就是一个线程!
      

  2.   

    我认为,dll中用的是虚拟内存,一旦dll退出,整个虚拟内存的架构都不在了,在其中分配的内存还能存在吗?
      

  3.   

    在DLL中分配的内存必须在该函数结束的时候释放,否则会造成内存泄漏
      

  4.   

    每个DLL都有自己的堆栈,在DLL里分配内存是从DLL自己的堆里分配,所以DLL被卸载的时候分配的内存也一起被卸载掉了。另外从DLL里分配的内存也不可以在DLL之外的地方释放,否则会破坏堆栈导致程序崩溃。