Finding potential stack overflow issues in templates(在模板中查找潜在的堆栈溢出问题)
本文介绍了在模板中查找潜在的堆栈溢出问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我将应用程序中最近的一次崩溃跟踪为堆栈溢出问题,修复了该问题后,我想我应该使用Visual Studio代码分析工具重新检查代码中是否有任何类似的潜在错误。这发现了许多可能与报告类似的案例,如
警告C6262函数使用‘148140’个字节的堆栈:超过 /Analyze:堆栈大小为‘16384’。考虑将一些数据移动到 堆。SCCW-VC2015 c:cppaclCommonacltainer.h
当我查看代码时,它将我带到以下模板函数;
template<class TYPE, class ARG_TYPE, class INDEX>
inline INDEX CContainerBase<TYPE, ARG_TYPE, INDEX>::Add(ARG_TYPE newElement)
{
TYPE Temp = newElement;
INDEX nIndex = GetSize();
SetSize(nIndex + 1);
SetAt(nIndex,Temp);
return nIndex;
}
有问题的行在TYPE Temp = newElement;
,问题是我需要找出哪段代码使用了具有如此大的元素的模板化容器,因为模板本身不是问题。有没有办法找出这里使用的是模板的哪个具体实例化,即找出TYPE
指的是什么?
推荐答案
一种方法是对模板代码中元素的大小使用static_assert
,如下所示:
static_assert(sizeof(TYPE) < 16384, "Object is too large for the stack");
TYPE Temp = newElement;
这将在模板实例化的每个位置中断编译,该模板的类型对于堆栈来说太大。
这篇关于在模板中查找潜在的堆栈溢出问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:在模板中查找潜在的堆栈溢出问题
基础教程推荐
猜你喜欢
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 运算符重载的基本规则和习语是什么? 2022-10-31