FW:W2A、OLE2A等 ATL 宏会引发 stack overflow。使用时注意

原创 2011年01月10日 14:03:00

http://blog.csdn.net/tg2003/archive/2009/07/10/4336930.aspx

最近一个转换文件的程序,在转换大批量文件是老是 stack overflow。
查来查去。。原来是 在大循环中用了W2A和A2W两个宏。
MSDN的 TN059: Using MFC MBCS/Unicode Conversion Macros 有描述,这两个宏在大循环中要有特殊的写法,不然保不准就 stack overflow。
Other Considerations

Do not use the macros in a tight loop. For example, you do not want to write the following kind of code:

void BadIterateCode(LPCTSTR lpsz)

{

   USES_CONVERSION;

   for (int ii = 0; ii < 10000; ii++)

      pI->SomeMethod(ii, T2COLE(lpsz));

}

The code above could result in allocating megabytes of memory on the stack depending on what the contents of the string lpsz is! It also takes time to convert the string for each iteration of the loop. Instead, move such constant conversions out of the loop:

void MuchBetterIterateCode(LPCTSTR lpsz)

{

   USES_CONVERSION;

   LPCOLESTR lpszT = T2COLE(lpsz);

   for (int ii = 0; ii < 10000; ii++)

      pI->SomeMethod(ii, lpszT);

}

If the string is not constant, then encapsulate the method call into a function. This will allow the conversion buffer to be freed each time. For example:

void CallSomeMethod(int ii, LPCTSTR lpsz)

{

   USES_CONVERSION;

   pI->SomeMethod(ii, T2COLE(lpsz));

}

void MuchBetterIterateCode2(LPCTSTR* lpszArray)

{

   for (int ii = 0; ii < 10000; ii++)

      CallSomeMethod(ii, lpszArray[ii]);

}

Never return the result of one of the macros, unless the return value implies making a copy of the data before the return. For example, this code is bad:

LPTSTR BadConvert(ISomeInterface* pI)

{

   USES_CONVERSION;

   LPOLESTR lpsz = NULL;

   pI->GetFileName(&lpsz);

   LPTSTR lpszT = OLE2T(lpsz);

   CoMemFree(lpsz);

   return lpszT; // bad! returning alloca memory

}

The code above could be fixed by changing the return value to something that copies the value:

CString BetterConvert(ISomeInterface* pI)

{

   USES_CONVERSION;

   LPOLESTR lpsz = NULL;

   pI->GetFileName(&lpsz);

   LPTSTR lpszT = OLE2T(lpsz);

   CoMemFree(lpsz);

   return lpszT; // CString makes copy

}

The macros are easy to use and easy to insert into your code, but as you can tell from the caveats above, you need to be careful when using them.

考后总结——2016的最后一波自学考试(c++、数据结构)

听到很多人在说(包括自己之前也是),某某东西,学起来好难!好难!其实,学习这件事情,并不是要学习的事情本身难。而是,学习者想要得到好的结果,并且想要找到一个最简单的办法,更有意思的是,还不想花太多的时...

stack overflow[part2]

Target program:// vulnerable.c #include #include int main(int argc, char *argv[]) { char searc...

Stack Overflow架构揭秘(软硬件、人员、数字)(2)

Stack Overflow架构揭秘(软硬件、人员、数字)(2)

php 使用pear库发送带附件邮件(来自Stack overflow)

如何优雅地使用 Stack Overflow?

作者:王月 链接:http://www.zhihu.com/question/20824615/answer/21783520 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转...

Stack Overflow architecture qcon china

  • 2014年08月06日 18:24
  • 3.4MB
  • 下载

stack overflow

  • 2008年06月25日 13:20
  • 2.86MB
  • 下载

为什么 Stack Overflow 会如此成功?

最近问答类网站相当的热门。说起问答(Question & Answer)网站,很多人会第一反应想起 Quora ,实际上,这类网站中 Quora 并非做的最好的(但或许是借了 Facebook 的风头...

stack overflow

  • 2008年06月25日 13:08
  • 2.44MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FW:W2A、OLE2A等 ATL 宏会引发 stack overflow。使用时注意
举报原因:
原因补充:

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