for 循环中的 OLE 宏

OLE macro in a for loop

本文关键字:OLE 循环 for      更新时间:2023-10-16

根据 OLE 转换宏的 MSDN 文档,例如,如果我们在 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 宏,或者我们仍然可能遇到堆栈溢出?

使用上述方法还会有其他问题吗?

第三个示例将不起作用,因为从函数返回后,在该方法中创建的T2COLE对象将立即销毁。正如您在问题中指出的那样,对象是在堆栈上创建的,通常的堆栈规则适用于这种情况 - 一旦超出范围,该对象将被销毁,在第三种情况下,您将访问垃圾数据。

第二种情况是用于使用数据而不触发堆栈溢出的正确机制,因为在从函数返回时,T2COLE分配的内存将被释放。

我不知道T2COLE的实现是如何工作的,但是在 C 中,您可以通过使用 alloca 函数来实现相同的行为,该函数会遇到同样的问题 - 一旦您从函数返回,您应该将指针和它指向的数据视为无效。