我将我的应用程序中最近的一次崩溃归因于堆栈溢出问题,在解决该问题后,我想我应该使用 visual studio 代码分析工具重新检查代码是否存在任何类似的潜在错误。这发现了许多可能的类似案例,并有一份报告,例如
Warning C6262 Function uses '148140' bytes of stack: exceeds /analyze:stacksize '16384'. Consider moving some data to heap. SCCW-VC2015 c:\cpp\aclcommon\aclcontainer.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++ - 查找模板中潜在的堆栈溢出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42040959/