我很遗憾这个c ++错误。
我有一个" exe"它导出" .lib",并加载" dll"导入此" .lib"。我可以用这个方法解决问题。但是当我使用" EscapeJson"时,会出现异常。如果我将代码复制到库中并替换" CoreHelper :: EscapeJson"与" EscapeJson" (同一个图书馆)一切都好......
出了什么问题?
My.EXE (Export) -> My.lib (Import) -> MyDll.dll
^ |
`---------------------------------------
此代码也有效,因为" EscapeJson"成功返回值...
Escape Json Source
std::string CoreHelper::EscapeJson(char * input, int length)
{
std::ostringstream o;
for (int x = 0; x < length; x++)
{
char c = input[x];
switch (c)
{
case '"': o << "\\\""; break;
case '\\': o << "\\\\"; break;
case '\b': o << "\\b"; break;
case '\f': o << "\\f"; break;
case '\n': o << "\\n"; break;
case '\r': o << "\\r"; break;
case '\t': o << "\\t"; break;
default:
if ('\x00' <= c && c <= '\x1f')
{
o << "\\u"
<< std::hex << std::setw(4) << std::setfill('0') << (int)c;
}
else
{
o << c;
}
}
}
return o.str();
}
答案 0 :(得分:1)
您无法跨DLL边界传递std::string
(或几乎任何其他非POD类型)。在这种情况下,std::string
的原始内存在EXE内部分配,并由编译到EXE中的内存管理器管理。 DLL将无法正确释放它,只有EXE可以。
您需要使用跨DLL边界安全使用的互操作数据类型和内存管理技术。
在这种情况下,请尝试更类似的内容:
char* CoreHelper::EscapeJson(char * input, int length)
{
std::ostringstream o;
//...
std::string s = o.str();
char *res = new char[s.size()+1];
std::copy(s.begin(), s.end(), res);
res[s.size()] = 0;
return res;
}
void CoreHelper::FreeEscapedJson(char * input)
{
delete [] input;
}
char *str = CoreHelper::EscapeJson(...);
// use str as needed...
CoreHelper::FreeEscapedJson(str);