Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我怎样才能通过C++;对象到具有不同_迭代器_调试_级别的DLL_C++_Visual Studio 2010_Stl - Fatal编程技术网

C++ 我怎样才能通过C++;对象到具有不同_迭代器_调试_级别的DLL

C++ 我怎样才能通过C++;对象到具有不同_迭代器_调试_级别的DLL,c++,visual-studio-2010,stl,C++,Visual Studio 2010,Stl,我的可执行文件调用我自己编写的许多DLL。根据这些DLL使用的第三方C++ LIBS,我不能自由地选择所有DLL的编译器设置。因此,在某些DLL中,迭代器调试级别设置为2(调试版本中的默认值),但在我的可执行文件中,迭代器调试级别根据严重的性能问题设置为0 当我现在将std::string传递给DLL时,只要DLL尝试将其复制到本地std::string对象,应用程序就会崩溃,因为DLL中字符串对象的内存布局与可执行文件中的不同。到目前为止,我通过传递C字符串来解决这个问题。我甚至编写了一个小类

我的可执行文件调用我自己编写的许多DLL。根据这些DLL使用的第三方C++ LIBS,我不能自由地选择所有DLL的编译器设置。因此,在某些DLL中,迭代器调试级别设置为2(调试版本中的默认值),但在我的可执行文件中,迭代器调试级别根据严重的性能问题设置为0

当我现在将
std::string
传递给DLL时,只要DLL尝试将其复制到本地std::string对象,应用程序就会崩溃,因为DLL中字符串对象的内存布局与可执行文件中的不同。到目前为止,我通过传递C字符串来解决这个问题。我甚至编写了一个小类,将std::map转换成C-Data中的临时表示形式,并将其转换成临时表示形式,以便将sich数据从DLL传递到DLL。这很有效


我怎样才能克服这个问题?我想传递更多不同的类和容器,出于几个原因,我不想使用
\u ITERATOR\u DEBUG\u LEVEL
=2

我自己在使用诸如_SECURE_SCL和_ITERATOR_DEBUG_LEVEL之类的标志时的经验是,如果试图通过dll边界传递stl对象,则它们必须是一致的。 但是,我认为您可以将stl对象传递给具有较小_迭代器_调试_级别的dll 因为您可能会将调试dll中实例化的stl对象交给在发布模式下编译的dll

2011年4月7日编辑 显然,VisualStudio2010提供了一些细节来检测迭代器调试级别之间的不匹配。我还没有看录像


我自己对“安全”SCL和“迭代器调试”级别等标志的经验是,如果试图通过dll边界传递stl对象,则它们必须一致。 但是,我认为您可以将stl对象传递给具有较小_迭代器_调试_级别的dll 因为您可能会将调试dll中实例化的stl对象交给在发布模式下编译的dll

2011年4月7日编辑 显然,VisualStudio2010提供了一些细节来检测迭代器调试级别之间的不匹配。我还没有看录像


< /P> < P>不推荐使用具有第三方LIBS的复杂类型的C++接口(STL),如果只将它们作为二进制或需要与设置不同的编译的特殊设置。 正如您所写的,根据您的设置,同一个编译器的实现可能会有所不同,而使用不同的编译器,情况会变得更糟

如果可能,使用编译器和设置编译第三方库


如果这是不可能的,您可以编写一个包装DLL,该DLL使用与第三方库相同的编译器和设置进行编译,并为您提供一个C-Data接口。在项目中,可以编写另一个包装类,以便可以用STL对象进行函数调用,并将其转换为“后台”。

< P>不推荐使用具有第三方LIBS的复杂类型(STL)的C++接口,如果您仅将它们作为二进制文件获取,或者需要与您的设置不同的特殊编译设置

正如您所写的,根据您的设置,同一个编译器的实现可能会有所不同,而使用不同的编译器,情况会变得更糟

如果可能,使用编译器和设置编译第三方库


如果这是不可能的,您可以编写一个包装DLL,该DLL使用与第三方库相同的编译器和设置进行编译,并为您提供一个C-Data接口。在您的项目中,您可以编写另一个包装器类,以便使用STL对象进行函数调用,并在“后台”转换和传输它们。

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

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

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

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

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


主要问题是暴露类的模板成员。解决这一问题的一种方法是使用PImpl习惯用法:创建(或生成)一个API headers,它只公开可以对二进制文件执行的操作,然后确保API具有指向二进制文件中真实对象的指针。API将在库外部使用,但在库内部,您可以根据需要编写代码。DirectX API和其他操作系统API就是这样做的。

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

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

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

接口中的std::string可以替换为const char*。你