资源描述:
《使用USES_CONVERSION导致内存泄露》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、使用USES_CONVERSION导致内存泄露首先,先介绍下USES_CONVERSION为何物。USES_CONVERSION是ATL中的一个宏定义。用于编码转换(用的比较多的是CString向LPCWSTR转换)。通俗的说,就是你用了这个宏后,就可以用一系列的字符串转换宏,有OLE到T,T到OLE,OLE到W,W到OLE等等,非常方便。或者说,这个宏会告诉编译器,在紧接的代码中我们要用ole库中代码(如ansi 到unicode 的A2W(...))的转换宏,不加USES_CONVERSION在使用A2W会出错。
2、要想使用这个宏,因为它是ATL库带的,所以要加上头文件#include。关于USES_CONVERSION的使用,下面是从网上摘来的一段话,讲的很不错。USES_CONVERSION是ATL中的一个宏定义。用于编码转换(用的比较多的是CString向LPCWSTR转换)。在ATL下使用要包含头文件#include"atlconv.h"使用USES_CONVERSION一定要小心,它们从堆栈上分配内存,直到调用它的函数返回,该内存不会被释放。如果在一个循环中,这个宏被反复调用几万次,将不可避免的产生s
3、tackoverflow。 在一个函数的循环体中使用A2W等字符转换宏可能引起栈溢出。#includevoidfn(){ while(true) { { USES_CONVERSION; DoSomething(A2W("SomeString")); } }}让我们来分析以上的转换宏#defineA2W(lpa)( ((_lpa=lpa)==NULL)?NULL:( _convert=(lstrlenA(_lp
4、a)+1), ATLA2WHELPER((LPWSTR)alloca(_convert*2),_lpa,_convert)))#defineATLA2WHELPERAtlA2WHelperinlineLPWSTRWINAPIAtlA2WHelper(LPWSTRlpw,LPCSTRlpa,intnChars,UINTacp){ ATLASSERT(lpa!=NULL); ATLASSERT(lpw!=NULL); //verifythatnoillegalcharacterpresent //since
5、lpwwasallocatedbasedonthesizeoflpa //don'tworryaboutthenumberofchars lpw[0]=' '; MultiByteToWideChar(acp,0,lpa,-1,lpw,nChars); returnlpw;}关键的地方在alloca 内存分配内存上。#definealloca _alloca_allocaAllocatesmemoryonthestack.Remarks_allocaallocatessizebytesfromtheprogra
6、mstack.Theallocatedspaceisautomaticallyfreedwhenthecallingfunctionexits.Therefore,donotpassthepointervaluereturnedby_allocaasanargumenttofree.问题就在这里,分配的内存是在函数的栈中分配的。而VC编译器默认的栈内存空间是2M。当在一个函数中循环调用它时就会不断的分配栈中的内存。以上问题的解决办法:1、自己写字符转换函数,不要偷懒Functionthatsafelyconvertsa'
7、WCHAR'Stringto'LPSTR':char*ConvertLPWSTRToLPSTR(LPWSTRlpwszStrIn){ LPSTRpszOut=NULL; if(lpwszStrIn!=NULL) { intnInputStrLen=wcslen(lpwszStrIn); //DoubleNULLTermination intnOutputStrLen=WideCharToMultiByte(CP_ACP,0,lpwszStrIn,nInputStrLen,NULL,0,0,0)+2; pszOut=new
8、char[nOutputStrLen]; if(pszOut) { memset(pszOut,0x00,nOutputStrLen); WideCharToMultiByte(CP_ACP,0,lpwszStrIn,nInputStrLen,pszOut,nOutputStrLen,0,0); } } retu