Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1017592
  • 博文数量: 243
  • 博客积分: 3053
  • 博客等级: 中校
  • 技术积分: 2975
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-02 21:11
文章分类

全部博文(243)

文章存档

2013年(2)

2012年(20)

2011年(5)

2010年(114)

2009年(102)

我的朋友

分类:

2010-12-08 18:24:45

1临时对象的

 

2.4就曾提到了临时对象,在是深入了解它候了。

1.                  临时对象指MFC象,是MFC或者程序使用FromHandle或者SelectObject等从一个Windows象句柄建的对应MFC象。  

2.                  在模-线程状中,临时MFC象的映射是和永久映射分保存的。

3.                  临时MFC象在使用完后由MFC框架自动删除,MFC线程的Idle理中除本线程的临时MFC象,了防止并修改,通过线程状m_nTempMapLock(等于0,可以修改,大于0,等待)来同。所以,临时MFC象不能保存用。

 2 态对象的除和销毁

 至此,本章讨论MFC线程局部存机制,MFC的定实现和用途。在程序或者DLL退出之前,模销毁;在线程退出线程状销毁。状态对象被销毁之前,它活动态创建的象被销毁动态分配的内存被放。

先解几个函数:

AfxTermExtensionModule(HANDLE hInstanceOfDllBOOL bAll);

bAll真,则该函数销毁本模(hInstanceOfDll标识的模)的模m_libraryList列表中所有动态分配的CDynLinkLibrary象,否函数清理本DLL动态分配的CDynLinkLibrary象,并AfxTerLocalData放本DLL块为当前线程的线程局部量分配的堆空

AfxTermLocalData(HANDLE hInstance, BOOL bAll);

bAll真,则删MFC线程局部存的所有槽的指所指的象,也就是销毁当前线程的全部局部量,为这线程局部量分配的内存;否仅仅删除、清理当前线程在hInstance表示的DLL建的线程局部量。

参与清理工作的函数有多、多个,下面合具体情况要描述它的作用。

1对动态链接到MFC DLL用程序

动态链接到MFC DLL用程序退出,将在DllMainRawDllMain程分离清理状态对象,DllMainRawDllMain是核心MFC DLL的入口和出口,在DLLINIT.CPP文件中实现,和程分离完成如下作:

DllMainAfxTermExtensionModule(coreDll)清理核心MFC DLL的模AfxTermExtensionModule(coreDll, TRUE)清理OLE私有的模AfxTermLocalData(NULL, TRUE)放本程或者线程所有的局部量。

RawDllMainDllMain之后用,它AfxTlsRealeaseAfxTlsRealease减少_afxThreadData的引用数,如果引用数零,则调对应CThreadSlotData析构函数清理_afxThreadData所指象。

2态链接到MFC DLL用程序

如果是静态链接到MFC DLL用程序,由于RawDllMainDllMain不起作用,将由一个静态变量析构完成状的清除:

有一个AFX_TERM_APP_STATE型的静态变量,在程序将被销毁致析构函数被用,析构函数完成以下作:

AfxTermLocalData(NULL, TRUE)放本程(主线程)的所用局部数据。

3动态链接到MFC DLL规则DLL

动态链接到MFC DLL规则DLL,将在RawDllMainDllMain中清理状态对象。两个函数在DllModule.cpp中定,是规则DLL的入口和出口。当和程分离,分有如下作:

DllMain清除的模-线程状中的所有临时映射,清除临时MFC象;AfxWinTermAfxTermExtensionModule(controlDLL, TRUE)放本DLLm_libraryList中的所有CDynLinkLibrary象。

RawDllMain线程状的模,使它指向线程状m_PrevModuleState所指状

4于静态链接到MFC DLLDLL

于静态链接到MFC DLLDLL,只有DllMain会被用,行以下作:

清除的模-线程状中的所有临时映射,清除临时MFC象;AfxWinTermAfxTermLocalData(hInstance, TRUE)清理本DLL的当前线程的线程局部数据。

另外,它定一个_AFX_TERM_DLL_STATE型的静态变量,在DLL退出时该变量被销毁致其析构函数被用。析构函数完成如下作:

AfxTermateLocalData(NULL, TRUE);AfxCriticlTerm关键变量;AfxTlsRealease

5线

当使用AFxBeginThread建的线,将AfxTermThread(HANDLE hInstance)线程的清理工作(参数NULL):销毁临时MFC象,销毁线程的线程局部量,等等。

另外,当DLLAfxBeginThread建的线程分离,也AfxTermThread(hInstance),参数是模的句柄,销毁临时MFC象,销毁线程在本DLL建的线程局部量,等等。所以,AfxTermThread可能被用两次。

最后,CThreadLocalCProcessLocal例将被销毁,析构函数被用:如果MFC线程局部存的槽m_nSlot所指的线程局部没有销毁则销毁它。

_afxThreadDataMFC DLLRawDllMain或者随着_AFX_TERM_APP_STATE析构函数的用,_afxThreadData所指象被销毁_afxThreadData所指销毁之后,所有的状的内存都被

阅读(1361) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~