今天码的时候遇到了个小问题。起初因为在宏函数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 ];
重新编译运行代码,运行正确!