【发布时间】:2011-01-21 13:02:37
【问题描述】:
我有以下代码:
std::string F()
{
WideString ws = GetMyWideString();
std::string ret;
StringUtils::ConvertWideStringToUTF8(ws, ret);
return ret;
}
WideString 是第三方类,StringUtils 也是。它们对我来说是一个黑匣子。第二个参数通过引用传递。
当我单步调试调试器时,return ret 行会抛出一个令人讨厌的弹出窗口 (Visual C++),说堆可能已损坏。仔细检查返回的字符串副本是可以的,但删除ret 失败。 ret 在返回之前包含正确的值。
转换函数可能会导致这种情况吗?有什么想法可以解决吗?
更新:
- 项目本身就是一个 dll
- StringUtils 是一个库
- 项目是针对多线程 CRT 编译的(不是调试,不是 dll)
- 在 Visual Studio 之外运行时,程序似乎运行良好
【问题讨论】:
-
StringUtils是你自己编译的还是第三方库? std::string 的实现可能因编译器而异。 -
那么要么它有一个错误,要么它的编译器设置与你的不同。 (我认为您确实使用与编译 lib 的编译器相同的编译器。)
-
@sbi:更有可能是 StringUtils 接口坏了。它不应该使用字符串或作为函数参数。
-
@sbi:约翰是绝对正确的,我会在对他的回答的评论中解释原因。
-
这应该被标记为“onedefinitionrule”
标签: c++ corruption heap-memory one-definition-rule