c++ - 我如何将 C++ 对象传递给具有不同 _ITERATOR_DEBUG_LEVEL 的 DLL

标签 c++ visual-studio-2010 stl

我的可执行文件调用了一些我自己编写的 DLL。根据这些 DLL 使用的第三方 C++ 库,我无法为所有 DLL 自由选择编译器设置。因此在某些 DLL 中 _ITERATOR_DEBUG_LEVEL设置为 2(调试版本中的默认值),但在我的可执行文件中 _ITERATOR_DEBUG_LEVEL根据严重的性能问题设置为 0。

当我现在通过 std::string当 DLL 尝试将其复制到本地 std::string obj 时,应用程序崩溃,因为 DLL 中字符串对象的内存布局与我的可执行文件中的不同。到目前为止,我通过传递 C 字符串来解决这个问题。我什至写了一个小类来转换 std::map<std::string, int>进出 C-Data 中的临时表示,以便将 sich 数据从 DLL 传递到 DLL。这行得通。

我该如何克服这个问题?我想传递更多不同的类和容器,出于多种原因我不想使用 _ITERATOR_DEBUG_LEVEL = 2.

最佳答案

问题是std::string等容器都是模板类。它们是在编译时为每个二进制文件生成的,因此在您的情况下它们的生成方式不同。你可以说它不是同一个对象。

要解决此问题,您有多种解决方案,但它们都遵循相同的经验法则:不要在二进制文件之间共享的 header 代码中公开任何模板代码

您可以仅为此目的创建特定接口(interface),或者只是确保您的 header 不公开模板类型和函数。您可以在二进制文件中使用这些模板类型,但不要将它们暴露给其他二进制文件。

接口(interface)中的 std::string 可以替换为 const char * 。您仍然可以在您的系统中使用 std::string,只需在接口(interface)中请求 const char * 并使用 std::string::c_str() 来公开您的数据。

对于 map 和其他容器,您必须提供允许外部代码操作内部 map 的函数。像“Find(const char* key);”。

主要问题出在公开类的模板成员上。解决这个问题的一种方法是使用 PImpl 惯用语:创建(或生成)一个 API, header ,它只公开二进制文件可以做什么,然后确保 API 具有指向二进制文件中真实对象的指针。 API 将在外部使用,但在您的库中,您可以随心所欲地编写代码。 DirectX API 和其他操作系统 API 就是这样完成的。

关于c++ - 我如何将 C++ 对象传递给具有不同 _ITERATOR_DEBUG_LEVEL 的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5339811/

相关文章:

vb.net - 如何获得偶数或奇数

c# - 别名和点网类型和 c# 类型

c++ - 如何折叠STL vector 的子 vector ?

C++ for-each 语句触发 "vector iterators incompatible"断言失败 : this->_Getcont() == 0

c++ - 在 std::pair 中存储 std::string 和自定义对象

c++ - 使用带有 pure_out_value 策略的 std::string& Reference 的 Luabind 函数不可能吗?

c++ - 删除一个类的所有成员

c++ - PNPDeviceID 值的含义是什么?

c - Visual C++ 2010 Express 代码中的灰色(禁用)文本。这是什么意思?我该如何解决?

c++ - DirectX 小应用程序像 hell 一样消耗资源