📄 crtlib.c
字号:
#ifdef _DEBUG
/* Dump all memory leaks */
if (_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) & _CRTDBG_LEAK_CHECK_DF)
{
_CrtSetDumpClient(NULL);
__freeCrtMemory();
_CrtDumpMemoryLeaks();
}
#endif /* _DEBUG */
/*
* What remains is to clean up the system resources we have
* used (handles, critical sections, memory,...,etc.). This
* needs to be done if the whole process is NOT terminating.
*/
if ( lpreserved == NULL )
{
/*
* The process is NOT terminating so we must clean up...
*/
_ioterm();
/* free TLS index, call _mtdeletelocks() */
_mtterm();
/* This should be the last thing the C run-time does */
_heap_term(); /* heap is now invalid! */
}
}
__finally {
/* we shouldn't really have to care about this, because
letting an exception escape from DllMain(DLL_PROCESS_DETACH) should
result in process termination. Unfortunately, Windows up to Win7 as of now
just silently swallows the exception.
I have considered all kinds of tricks, but decided to leave it up to OS
folks to fix this.
For the time being just remove our FLS callback during phase 2 unwind
that would otherwise be left pointing to unmapped address space.
*/
if ( lpreserved == NULL && __flsindex != FLS_OUT_OF_INDEXES )
_mtterm();
}
}
else
/* no prior process attach, just return */
return FALSE;
}
else if ( dwReason == DLL_THREAD_ATTACH )
{
_ptiddata ptd;
/* Initialize FlsGetValue function pointer */
__set_flsgetvalue();
if ( (ptd = FLS_GETVALUE(__flsindex)) == NULL)
{
if ( ((ptd = _calloc_crt(1, sizeof(struct _tiddata))) != NULL))
{
if (FLS_SETVALUE(__flsindex, (LPVOID)ptd) ) {
/*
* Initialize of per-thread data
*/
_initptd(ptd, NULL);
ptd->_tid = GetCurrentThreadId();
ptd->_thandle = (uintptr_t)(-1);
} else
{
_free_crt(ptd);
return FALSE;
}
} else
{
return FALSE;
}
}
}
else if ( dwReason == DLL_THREAD_DETACH )
{
_freeptd(NULL); /* free up per-thread CRT data */
}
/* See above declaration of _CrtEndBoot */
_CrtEndBoot();
return TRUE;
}
/*
* Earlier the below exports were only for X86, but with invent of /clr:pure,
* they need to be defined for all the platform.
*/
/*
* Functions to access user-visible, per-process variables
*/
/*
* Macro to construct the name of the access function from the variable
* name.
*/
#define AFNAME(var) __p_ ## var
/*
* Macro to construct the access function's return value from the variable
* name.
*/
#define AFRET(var) &var
/*
***
*** Template
***
_CRTIMP __cdecl
AFNAME() (void)
{
return AFRET();
}
***
***
***
*/
#ifdef _DEBUG
_CRTIMP long *
AFNAME(_crtAssertBusy) (void)
{
return AFRET(_crtAssertBusy);
}
_CRTIMP long *
AFNAME(_crtBreakAlloc) (void)
{
return AFRET(_crtBreakAlloc);
}
_CRTIMP int *
AFNAME(_crtDbgFlag) (void)
{
return AFRET(_crtDbgFlag);
}
#endif /* _DEBUG */
_CRTIMP char ** __cdecl
AFNAME(_acmdln) (void)
{
return AFRET(_acmdln);
}
_CRTIMP wchar_t ** __cdecl
AFNAME(_wcmdln) (void)
{
return AFRET(_wcmdln);
}
_CRTIMP int * __cdecl
AFNAME(__argc) (void)
{
return AFRET(__argc);
}
_CRTIMP char *** __cdecl
AFNAME(__argv) (void)
{
return AFRET(__argv);
}
_CRTIMP wchar_t *** __cdecl
AFNAME(__wargv) (void)
{
return AFRET(__wargv);
}
_CRTIMP int * __cdecl
AFNAME(_commode) (void)
{
return AFRET(_commode);
}
_CRTIMP int * __cdecl
AFNAME(_daylight) (void)
{
_BEGIN_SECURE_CRT_DEPRECATION_DISABLE
return AFRET(_daylight);
_END_SECURE_CRT_DEPRECATION_DISABLE
}
_CRTIMP long * __cdecl
AFNAME(_dstbias) (void)
{
_BEGIN_SECURE_CRT_DEPRECATION_DISABLE
return AFRET(_dstbias);
_END_SECURE_CRT_DEPRECATION_DISABLE
}
_CRTIMP char *** __cdecl
AFNAME(_environ) (void)
{
return AFRET(_environ);
}
_CRTIMP wchar_t *** __cdecl
AFNAME(_wenviron) (void)
{
return AFRET(_wenviron);
}
_CRTIMP int * __cdecl
AFNAME(_fmode) (void)
{
_BEGIN_SECURE_CRT_DEPRECATION_DISABLE
return AFRET(_fmode);
_END_SECURE_CRT_DEPRECATION_DISABLE
}
_CRTIMP char *** __cdecl
AFNAME(__initenv) (void)
{
return AFRET(__initenv);
}
_CRTIMP wchar_t *** __cdecl
AFNAME(__winitenv) (void)
{
return AFRET(__winitenv);
}
_CRTIMP FILE *
AFNAME(_iob) (void)
{
return &_iob[0];
}
_CRTIMP unsigned char * __cdecl
AFNAME(_mbctype) (void)
{
return &_mbctype[0];
}
_CRTIMP unsigned char * __cdecl
AFNAME(_mbcasemap) (void)
{
return &_mbcasemap[0];
}
_CRTIMP int * __cdecl
AFNAME(__mb_cur_max) (void)
{
_ptiddata ptd = _getptd();
pthreadlocinfo ptloci = ptd->ptlocinfo;
__UPDATE_LOCALE(ptd, ptloci);
return AFRET(__MB_CUR_MAX(ptloci));
}
_CRTIMP const unsigned short ** __cdecl
AFNAME(_pctype) (void)
{
_ptiddata ptd = _getptd();
pthreadlocinfo ptloci = ptd->ptlocinfo;
__UPDATE_LOCALE(ptd, ptloci);
return AFRET(ptloci->pctype);
}
_CRTIMP const unsigned short ** __cdecl
AFNAME(_pwctype) (void)
{
return AFRET(_pwctype);
}
_CRTIMP char ** __cdecl
AFNAME(_pgmptr) (void)
{
_BEGIN_SECURE_CRT_DEPRECATION_DISABLE
return AFRET(_pgmptr);
_END_SECURE_CRT_DEPRECATION_DISABLE
}
_CRTIMP wchar_t ** __cdecl
AFNAME(_wpgmptr) (void)
{
_BEGIN_SECURE_CRT_DEPRECATION_DISABLE
return AFRET(_wpgmptr);
_END_SECURE_CRT_DEPRECATION_DISABLE
}
_CRTIMP long * __cdecl
AFNAME(_timezone) (void)
{
_BEGIN_SECURE_CRT_DEPRECATION_DISABLE
return AFRET(_timezone);
_END_SECURE_CRT_DEPRECATION_DISABLE
}
_CRTIMP char ** __cdecl
AFNAME(_tzname) (void)
{
_BEGIN_SECURE_CRT_DEPRECATION_DISABLE
return &_tzname[0];
_END_SECURE_CRT_DEPRECATION_DISABLE
}
#endif /* defined (CRTDLL) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -