for 循环中的 OLE 宏
OLE macro in a for loop
根据 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
函数来实现相同的行为,该函数会遇到同样的问题 - 一旦您从函数返回,您应该将指针和它指向的数据视为无效。
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 在基于范围的for循环中使用结构化绑定声明
- 用于C++中带有数组和指针的循环
- 循环中的随机函数
- for 循环中的 OLE 宏
- 使用Embarcadero c++ (Builder)从Word OLE中检索和循环故事范围