谨慎使用A2W等字符转换宏

原创 2015年07月09日 08:34:10

在一个函数的循环体中使用A2W等字符转换宏可能引起栈溢出。


#include <atlconv.h>
void fn()
{
    while(true)
    {
        {
            USES_CONVERSION;
            DoSomething(A2W("SomeString"));
        }
    }
}

让我们来分析以上的转换宏

#define A2W(lpa) (\
   ((_lpa = lpa) == NULL) ? NULL : (\
      _convert = (lstrlenA(_lpa)+1),\
      ATLA2WHELPER((LPWSTR) alloca(_convert*2), _lpa, _convert)))

#define ATLA2WHELPER AtlA2WHelper

inline LPWSTR WINAPI AtlA2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars, UINT acp)
{
   ATLASSERT(lpa != NULL);
   ATLASSERT(lpw != NULL);
   // verify that no illegal character present
   // since lpw was allocated based on the size of lpa
   // don't worry about the number of chars
   lpw[0] = '\0';
   MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);
   return lpw;
}


关键的地方在 alloca  内存分配内存上。

#define alloca  _alloca

_alloca
Allocates memory on the stack.

Remarks
_alloca allocates size bytes from the program stack. The allocated space is automatically freed when the calling function

exits. Therefore, do not pass the pointer value returned by _alloca as an argument to free.

问题就在这里,分配的内存是在函数的栈中分配的。而VC编译器默认的栈内存空间是2M。当在一个函数中循环调用它时就会不断的分配栈中的内存。


以上问题的解决办法有一下两种:
1、自己写字符转换函数,不要偷懒
Function that safely converts a 'WCHAR' String to 'LPSTR':
char* ConvertLPWSTRToLPSTR (LPWSTR lpwszStrIn)
{
  LPSTR pszOut = NULL;
  if (lpwszStrIn != NULL)
  {
 int nInputStrLen = wcslen (lpwszStrIn);

 // Double NULL Termination
 int nOutputStrLen = WideCharToMultiByte (CP_ACP, 0, lpwszStrIn, nInputStrLen, NULL, 0, 0, 0) + 2;
 pszOut = new char [nOutputStrLen];

 if (pszOut)
 {
   memset (pszOut, 0x00, nOutputStrLen);
   WideCharToMultiByte(CP_ACP, 0, lpwszStrIn, nInputStrLen, pszOut, nOutputStrLen, 0, 0);
 }
  }
  return pszOut;
}


2、把字符转换部分放到一个函数中处理。

void fn2()
{
    USES_CONVERSION;
    DoSomething(A2W("SomeString"));
}

void fn()
{
    while(true)
    {
        fn2();
    }
}

以上希望能对你有所帮助.....



谨慎使用A2W等字符转换宏

在一个函数的循环体中使用A2W等字符转换宏可能引起栈溢出。 #include void fn() { while(true) { { USE...
  • educast
  • educast
  • 2013年09月22日 15:44
  • 2571

关于A2W字符转换宏

在一个函数的循环体中使用A2W等字符转换宏可能引起栈溢出。#include void fn(){    while(true)    {        {            USES_CONVER...
  • jia_xiaoxin
  • jia_xiaoxin
  • 2008年08月26日 10:11
  • 977

A2W和W2A :很好的多字节和宽字节字符串的转换宏

以前看《Window核心编程》,感觉多字节和宽字节之间还比较麻烦的,至少MultiByteToWideChar函数和WideCharToMultiByte函数有足够多的参数的意义让我们去理解。近日接触...
  • bytxl
  • bytxl
  • 2015年06月03日 13:40
  • 1092

W2A等宏的使用

在vc中做开发经常会遇到宽字节字符串和char[]之间的转换。MS提供了函数WideCharToMultiByte和MultiByteToWideChar函数供实现其转换,但是每次都要调用两次才能完成...
  • ghy429090
  • ghy429090
  • 2015年04月02日 11:43
  • 662

VC中一个关于宏的使用问题 A2W W2A

这儿是个关于宏的问题,我曾用过ATL的串转换宏,包括W2A,开始有些东西我还不太明白。为了使用这些宏,必须在函数的开始 处用USES_CONVERSION来初始化某些局部变量。用就用吧,但是看看这个...
  • TXH0001
  • TXH0001
  • 2011年10月07日 16:13
  • 5573

A2W和W2A宏可能引起栈内存溢出

这两个宏使用alloca在栈上分配内存,退出生命周期后才会释放所占用的内存. 所以在一个函数的循环体中使用A2W等字符转换宏可能引起栈溢出。 真想在循环中使用的话,这个宏用单独的大括号包含起来,类似这...
  • yjz1409276
  • yjz1409276
  • 2016年04月11日 10:16
  • 1031

A2W W2A等所需要的文件

1.包含头文件 #include #include 2.在使用前加上,注意,不是在文件都定义。     USES_CONVERSION;...
  • dyzhen
  • dyzhen
  • 2011年09月08日 15:29
  • 1352

UTF8转换宏和转换类

参考微软 ANSI和WCHAR的转换代码,编写的UTF8和ANSI、WCHAR转换代码。 可在ATL/MFC环境下使用。...
  • leechiyang
  • leechiyang
  • 2010年12月20日 20:53
  • 2782

ATL字符串转换宏

有比MultiByteToWideChar和WideCharToMultiByte更简单的字符串转换宏,你相信吗? 头文件 d:/program files/microsoft visual ...
  • earbao
  • earbao
  • 2013年09月15日 00:58
  • 5240

转 A2W、W2A、T2A、T2W 等宏

A2W、W2A、T2A、T2W 等宏 如果你觉得使用 WideCharToMultiByte,MultiByteToWideChar 等函数比较麻烦---众多的参数,缓冲区的分配与销毁等。那么可以使...
  • youzaicz
  • youzaicz
  • 2013年10月24日 00:24
  • 357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谨慎使用A2W等字符转换宏
举报原因:
原因补充:

(最多只允许输入30个字)