程序编译成功无报错,执行debug时,突然系统跳chkstk.asm
.。
报了堆栈错误。
定位问题
我们到堆栈最后执行的地方,发现是一个线程创建。这里肯定没有问题,那么问题肯定出现在线程的初始化里。
线程伪代码:
DWORD MyMainWnd::Run2()
{
string strGetIP="";
char m_szTemp [MaxFileSize_1M];
int nLength = 0;
while (true)
{
...
}
return 0;
}
单步走,定位问题:char m_szTemp [MaxFileSize_1M];
在分配较大空间的临时变量的时候系统会插入chkstk函数来检测是否超过堆栈上已经分配的空间,那么他的单元是多大呢?对于X86来说是4K x64是8k
。
解决方案
网上说是改成new的分配方式,但是我原本就是,那么排除这种解决方法。我这边的解决方法是:项目-》属性-》配置属性-》链接器-》系统 将堆栈保留大小改成50M。
拓展
读取位置冲突正常是堆栈分配出了问题,正常是分配的空间小了;
如果遇到“读取访问权限冲突”
,优先考虑,代码中出现读取空指针
或野指针
的内部变量;