您的位置:首页 > 产品设计 > UI/UE

一场由字符数组char szvalue[30]引发的“血案“

2013-04-19 12:22 423 查看
错误原因:

执行过程完全正常,但在退出一个线程函数时,出现异常:

voidRelease() throw()

{

ATLASSERT(nRefs != 0 ); // 卡在这个地方

if( _AtlInterlockedDecrement(&nRefs ) <= 0 )

pStringMgr->Free( this );

}

最初由于这个函数是释放CString变量有关的内容,所以认定肯定是Cstring变量出现问题了,所以一直致力

于寻找Cstring变量用错的地方,改了N多地方,但问题依旧,于是一行一行看函数中每个变量释放的顺序,到

底是那个出现问题了,经过几次测试之后,最后锁定了szvalue[30]这个字符串数组,改变它的位置啊,后由出现

了这个错误:

Stack aroundthe variable 'szValue' was corrupted.

所以认定了出现问题的就是他了,最终发现,

第一初始化,如果你要给定义之后就在某个函数体或其他方式中给他

赋值,可以不进行初始化,但初始化比较是保险的,所以为了避免一些不必要的错误,推荐线对其进行初始化。

第二数组越界处理:其实出现上述的错误:“szValue”周围的堆栈被破坏,很多一部分就是数组越界了。所以检查

一下数组越界就很有必要了。我在这里犯的一个致命错误就是szValue大小为30,而在调用一个函数时,由这样的

一段代码:

strcpy_s(szValue, nMaxLength, pChValue);

在这里nMaxLength却是一个大于30的数,所以,大于30以后的内存是未知的,所以函数不可能去释放一段未知

(与自己无关联)的内存了。因为指向他是指针是无效的执针,所以出现了断言:

ATLASSERT(nRefs != 0 ); // 卡在这个地方

内存块nRefs 应用计数等于了0,没有任何变量来引用,

所以ATLASSERT( nRefs != 0);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: