我有以下代码:
std::string F()
{
WideString ws = GetMyWideString();
std::string ret;
StringUtils::ConvertWideStringToUTF8(ws, ret);
return ret;
}
WideString是第三方类,StringUtils也是。他们对我来说是一个黑匣子。第二个参数通过引用传递。
当我单步执行调试器时return ret
抛出一个令人讨厌的弹出窗口(Visual C++),指出堆可能已损坏。仔细检查返回的字符串副本是可以的,但是删除ret
fails. ret
返回前包含正确的值。
转换函数可能会做什么导致这种情况?有什么想法要解决吗?
Update:
- 项目本身是一个dll
- StringUtils 是一个库
- 项目是针对多线程 CRT 编译的(不是调试,不是 dll)
- 在 Visual Studio 之外运行时,程序似乎运行良好
- 如果 StringUtils 是单独编译的(例如,使用不同的编译器版本),则对象布局可能会发生冲突。
- 如果 StringUtils 在 DLL 中,则必须确保它和主程序都被编译为使用 DLL 中的标准库。否则,每个模块(可执行文件和 DLL)将有自己的堆。当 StringUtils 尝试使用从不同堆分配的字符串中的数据时,就会发生不好的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)