使用USES_CONVERSION导致内存泄露

使用USES_CONVERSION导致内存泄露

ID:40589444

大小:22.80 KB

页数:6页

时间:2019-08-04

使用USES_CONVERSION导致内存泄露_第1页
使用USES_CONVERSION导致内存泄露_第2页
使用USES_CONVERSION导致内存泄露_第3页
使用USES_CONVERSION导致内存泄露_第4页
使用USES_CONVERSION导致内存泄露_第5页
资源描述:

《使用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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。