【发布时间】:2014-02-08 05:49:53
【问题描述】:
根据MSDN OLE 转换宏的文档,例如,如果我们在 for 循环中使用宏,它最终可能会在堆栈上分配更多内存,从而导致堆栈溢出。
这是MSDN上提供的例子
void BadIterateCode(LPCTSTR* lpszArray)
{
USES_CONVERSION;
for (int ii = 0; ii < 10000; ii++)
pI->SomeMethod(ii, T2COLE(lpszArray[ii]));
}
在上面的例子中,T2COLE 使用在一个可能导致堆栈溢出的 for 循环中,为了避免这种情况,方法调用被封装到这样的函数中
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]);
}
我们可以将 LPCTSTR 发送到另一个函数,而不是像这样封装整个方法,
LPCOLESTR CallSomeMethod(LPCTSTR lpsz)
{
USES_CONVERSION;
return T2COLE(lpsz);
}
void BadIterateCode(LPCTSTR* lpszArray)
{
for (int ii = 0; ii < 10000; ii++)
pI->SomeMethod(ii, CallSomeMethod(lpszArray[ii]));
}
谁能告诉我使用 OLE 宏是否安全,还是我们可能会遇到堆栈溢出?
使用上述方法会不会有其他问题?
【问题讨论】:
标签: c++ visual-c++ ole