我追踪了我的应用程序最近崩溃的堆栈溢出问题,并解决了问题,我想我会使用visual studio代码分析工具重新检查代码中是否存在任何类似的潜在错误。这发现了许多可能类似的案例,例如
警告C6262函数使用'148140'字节堆栈:超过 / analyze:stacksize'16384'。考虑将一些数据移动到 堆。 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
所指的内容?
答案 0 :(得分:6)
一种方法是对模板代码中元素的大小使用static_assert
,如下所示:
static_assert(sizeof(TYPE) < 16384, "Object is too large for the stack");
TYPE Temp = newElement;
这将破坏模板实例化的每个地方的编译,其类型对于堆栈来说太大。
答案 1 :(得分:1)
typeid(TYPE).name()
提供了一个适合调试的字符串,通常是根据ABI名称修改规则的类型名称。