【问题标题】:OLE macro in a for loopfor 循环中的 OLE 宏
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2023-03-22
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多