shared DLL VS static Link, Are they different?
hi, everyone, I meet a strange problem:
I'm using VC6 and create a dialog based applications. And I want to add
a third part library( Open computer library--OpenCV AS DLL). I linked
with the cxcored.lib. My APP will call functions in cxcore001d.dll.
I only add two functions in the OnInitDialog function:
/////////////////////////////////////////////////////////////////
BOOL COpenCVdialogDlg::OnInitDialog()
{
......
m_iplImage = cvCreateImage(ImgSize,IPL_DEPTH_8U,IMAGE_CHANNELS);
cvReleaseImage(&m_iplImage);
......
}
////////////////////////////////////////////////////////////////
In the code above, I only create an Image and release it quickly, which
seems I do Nothing. ^_^ ,The two functions are exported from
cxcore100d.dll( associated with cxcored.lib)
Here comes my problem. When I build the APP with static MFC library, the
program works fine. But When I build the APP with "Using MFC as shared
DLL" option, there are many memory leak report when I exit the APP.
It is very strange that "using MFC as shared DLL" and "using MFC as a
static library" are much different? Otherwise, There are something wrong
with the source code generating cxcore100d.dll?
By the way, OpenCV is an open source library,so, I have the full source
code of "cxcore100d.dll" , I examine the code and can't find anything wrong.
Here is its DLL Main entry:
////////////////////////////////////////////////////////////////
#if defined WIN32 || defined WIN64
BOOL WINAPI DllMain( HINSTANCE, DWORD fdwReason, LPVOID )
{
CvContext *pContext;
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
g_TlsIndex = TlsAlloc();
if( g_TlsIndex == TLS_OUT_OF_INDEXES ) return FALSE;
//break;
case DLL_THREAD_ATTACH:
pContext = icvCreateContext();
if( pContext == NULL)
return FALSE;
TlsSetValue( g_TlsIndex, (LPVOID)pContext );
break;
case DLL_THREAD_DETACH:
if( g_TlsIndex != TLS_OUT_OF_INDEXES )
{
pContext = (CvContext*)TlsGetValue( g_TlsIndex );
if( pContext != NULL )
icvDestroyContext( pContext );
}
break;
case DLL_PROCESS_DETACH:
if( g_TlsIndex != TLS_OUT_OF_INDEXES )
{
pContext = (CvContext*)TlsGetValue( g_TlsIndex );
if( pContext != NULL )
icvDestroyContext( pContext );
}
TlsFree( g_TlsIndex );
break;
default:
;
}
return TRUE;
}
////////////////////////////////////////////////////////////////
I was confused that why the "break" statement is commented after the
"case DLL_PROCESS_ATTACH:"?
Further more, the cvCreateImage and cvReleaseImage function in my APP is
regularly simple, they only allocate a piece of memory and delete it.
Thanks for reading my Post!