我有下列代码:

std::string F()
{
  WideString ws = GetMyWideString();

  std::string ret;
  StringUtils::ConvertWideStringToUTF8(ws, ret);
  return ret;
}

WideString是一个第三方类,因此都是既.他们是一个黑盒子给我。第二个参数是通过参考。

当我步骤,通过调试器的线 return ret 抛出了一个讨厌的弹出窗口(C++)说,堆可能被破坏。经仔细检查的副本串返回是确定的,但删除 ret 失败。 ret 包含正确的价值之前返回。

有什么可以转换功能可能做到因为这个?任何想法,以解决?

更新:

  • 项目本身是一个dll
  • 于是lib
  • 项目是编制对多线程CRT(不调试,不dll)
  • 程序似乎运行的现时运行以外的Visual Studio
有帮助吗?

解决方案

  1. 如果既是单独编译(例如,与不同的编译版本),可能有冲突的对象的布局。
  2. 如果既是一个问题,你必须确保它和主要程序编制使用的标准图书馆在DLL。否则,每个模块(可执行和DLL)将拥有自己堆。在于试图将发挥数据的字符串中被分配从一个不同的堆的坏事情发生。

其他提示

设计者对于设计一个非常贫穷。没有一个模板化的标准图书馆的类型应用在API的公共接口。 std::string 吹出的内联。因此,如果编译器和库您使用的是不精确的同样的编译器和库使用的实现既的种类可以而且可能会有所不同。从根本上说,实现既 无法单独的接口,从执行情况.

一个说明问题。假设你正在使用MSVC9.0sp1和我使用MSVC8.0.在我的编译器,实行性传染病::string可能是这样的:

class string
{
// : :  stuff
private:
  int someInt_;
  char* someBuf_;
};

...但是你编译器,它可能看起来不同的:

class string
{
// : :  stuff
private: 

  void* impl_;
};

如果我写了一个图书馆功能:

void DoSomethingWithAString(std::string& str);

...和你叫它, sizeof(string) 在代码中将是不同的 sizeof(string) 在我的代码。的类型也不相同。

你真的只有2解决你的问题:

1)[优选]得到实现既要解决他破碎的代码。

2)替代图书馆使用的编译器相匹配的图书馆使用StringUtil的实现者。你可能能够做到这一点通过使用相同的编译器在相同的贴水平的实现使用,假设他没有替换的执行情况的标准图书馆。

编辑:3)第三个选择将是停止使用既.老实说这可能是什么我想要做的。

从什么小的代码显示的,我想 StringUtils::ConvertWideStringToUTF8() 需要一个 std::string& 作为第二个参数。有鉴于此,我没看到你的代码可以引起一堆腐败。

然而,请注意,联C++图书馆一般只有工作的时候,府的代码汇编使用同样的编译器和同一编译器的设定。

你使用 StringUtilsWideString 使它看起来像你使用C++的建设者。你是想混个C++构建模块以及一些C++模块?如果是这样,那么你肯定看到的问题,你已经说明。

你可以不通过一个视觉C++ std::string C++生成器的功能,因为C++建设者码将假定参数使用C++建 std::string 定义。该课程可能会有不同的领域,该领域他们共有的可能在不同的顺序。

即使课程有相同的定义、模块仍将使用不同的记忆管理人员。在所谓的功能存储器将分配用于新的串的内容,使用它的存储管理,并呼叫者将使用其自己的存管理,以试图免费的串的内容以后。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top