C++代码中 栈溢出错误 chkstk.asm 一则
瞎整了半天之后,还是老老实实打开反汇编一步步看回调过程中发生了什么,居然在回调后,所有参数入栈后,调用chkstk.asm崩溃了,我晕倒,这个问题居然,回过头看C++代码,找找有啥大对象在栈里面晃悠,结果一看,居然有几处使用的是char[64*1024]的形式,这几处正好在一个函数调用中都递归了,于是光荣的越界了。于是修改那几处缓冲到堆上,问题解决了。
下面说下我对于char[size]形式的理解,由于char[]是编译期间分配内存的行为,估计对于一些耗用资源不大的调用,当然首先char[]的形式,但是如果需要的内存比较大,还是取堆中取,防止栈空间不足的崩溃。
我的习惯风格:
static const int N_MAX_STACK_BUFFER = 128;
TCHAR szBuffer[128] = {0};
TCHAR * pBuffer = szBuffer;
int nSize = GetBufferSize();
if (nSize >= N_MAX_STACK_BUFFER)
{
pBuffer = new TCHAR[nSize];
}
// Action
if (nSize >= N_MAX_STACK_BUFFER)
{
delete [] pBuffer;
pBuffer = NULL;
}
至此,第二个问题解决,但是第一个问题很诧异,也没有崩溃现象,怀疑是Debug作祟,切换到Release,把地址答应出来,OK,都正常了。这个VC的编译器还是比较邪门的。
另外,发现自己行文中闲扯真多。不是好习惯。
本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/783152,如需转载请自行联系原作者