1

我有一个加载 dll 的 exe。我都写了。

我正在导出一个返回 std::wstring 的函数 foo。

它所做的只是说

std::wstring blah = L"rgjwgfw";

  return blah.append(L"hey");

在我导入 foo 的 exe 中,字符串已损坏。一旦我从调用 foo 的函数返回,我就会得到失败的断言。有时我会收到一条消息,说 Windows 在 foo.exe 中触发了一个断点。这可能是由于堆损坏等......这也可能是由于用户在 foo.exe 具有焦点时按 f12。ETC....

知道为什么会这样吗?如果我从 foo 中删除附加行并且 jsut 返回原始字符串,则不会发生这种情况,没有问题。

谢谢

4

1 回答 1

3

这是一个很常见的问题。您需要链接 DLL 和可执行文件以使用 DLL 中的标准库。这样他们就可以共享标准库的一个公共副本和一个公共堆。否则,您最终会得到可执行文件中的代码尝试使用一个堆,而 DLL 中的代码使用单独的堆。当您通过边界传递几乎任何使用动态分配的东西时,每个都假定对象中动态分配的缓冲区来自其自己的堆。几乎任何操作不仅会破坏对象,还会破坏整个堆。

于 2011-04-20T17:03:54.433 回答