bug笔记: heap corruption detected: after normal block

今天码的时候遇到了个小问题。起初因为在宏函数Safe_Delete处直接断了,根本不知到问题如何解决。

问题如下


接着我搜索了一下这个问题,搜索到了如下文章: http://blog.sina.com.cn/s/blog_511703010100lz33.html

经过不断地调试,执行到如下代码块中

void acScriptContent::Remove() {
	SafeFreeWCHAR( &m_strScriptW ); // ERROR OCCURS
	m_pEachGetW = NULL;
}
在这个类的析构函数中我调用了这个方法,代码块目的是释放脚本字符串的指针。

结合上述文章的情况,我发现与其所描述的非常相近,都是由于字符串堆内存导致的问题。

于是我开始查看我写的字符串堆内存分配的函数,问题就浮现了出来。代码块如下:

inline wchar_t * AllocWCHAR( wchar_t ** ppStrW, const wchar_t * strW ) { 
	* ppStrW = new wchar_t[ wcslen( strW ) ]; // 1
	wcscpy( * ppStrW, strW );
	return * ppStrW;
}
代码的问题就出在  1 处,由于wcslen只获取字符串的长度(忽略\0)。因此,可以说与我搜索到的文章有完全相似的错误之处。字符串实际多出了一个空间,破坏了原来的指针,从而导致了这个问题。

由上述分析,修改代码

* ppStrW = new wchar_t[ wcslen( strW ) + 1 ];

重新编译运行代码,运行正确!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值