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

错误原因:
执行过程完全正常,但在退出一个线程函数时,出现异常:
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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值