如何正确编写一个C++的DLL,它将在调试模式下加载而不会崩溃 我的问题涉及本地C++ DLL VisualStudio 2005,如果它重要,如何编写它们以确保: 当DLL在发布模式下编译时,它将被以发布或调试模式优先编译的EXE正确加载 当DLL在调试模式下编译时,它也将由在调试模式下编译的EXE正确加载。 今天我有一个C++原生DLL,它在DLL发布/exe发布模式中加载和运行良好。DLL加载但无法正常工作函数调用在DLL发布/EXE发布模式下返回意外结果,这是一个很大的问题,因为它阻止我调试EXE,这是我的主要目标,并且在DLL调试/EXE调试模式下由于堆损坏而崩溃

如何正确编写一个C++的DLL,它将在调试模式下加载而不会崩溃 我的问题涉及本地C++ DLL VisualStudio 2005,如果它重要,如何编写它们以确保: 当DLL在发布模式下编译时,它将被以发布或调试模式优先编译的EXE正确加载 当DLL在调试模式下编译时,它也将由在调试模式下编译的EXE正确加载。 今天我有一个C++原生DLL,它在DLL发布/exe发布模式中加载和运行良好。DLL加载但无法正常工作函数调用在DLL发布/EXE发布模式下返回意外结果,这是一个很大的问题,因为它阻止我调试EXE,这是我的主要目标,并且在DLL调试/EXE调试模式下由于堆损坏而崩溃,c++,dll,debugging,crash,release,C++,Dll,Debugging,Crash,Release,我知道有一个与CRT相关的问题,需要在DLL和EXE之间进行CRT隔离。通常,通过在DLL中使运算符new/new[]/delete/delete[]私有,并通过允许创建EXE动态对象的创建/释放函数包装它们,可以解决此问题 我的问题是:在我开始按照这个方向重新分解所有代码之前,我还需要做些什么来避免此类问题?CRT隔离可能会修复我的DLL debug/EXE调试崩溃,但我不确定它是否会修复DLL release/EXE调试问题 有什么提示吗?有人已经遇到过这个问题吗 谢谢, Al.不要在公共D

我知道有一个与CRT相关的问题,需要在DLL和EXE之间进行CRT隔离。通常,通过在DLL中使运算符new/new[]/delete/delete[]私有,并通过允许创建EXE动态对象的创建/释放函数包装它们,可以解决此问题

我的问题是:在我开始按照这个方向重新分解所有代码之前,我还需要做些什么来避免此类问题?CRT隔离可能会修复我的DLL debug/EXE调试崩溃,但我不确定它是否会修复DLL release/EXE调试问题

有什么提示吗?有人已经遇到过这个问题吗

谢谢,
Al.

不要在公共Dll h文件中使用特定于配置的代码。例如:

class ExportedClass { ... #ifdef _DEBIG int debug_info; #endif ... } 在调试配置中编译Dll时,sizeofExportedClass包含额外的4个字节。当此文件由客户机代码编译为Release configuration时,sizeofExportedClass将减少4个字节。结果未定义


另外,不要使用任何具有特定配置大小的类型作为Dll公共接口的一部分:返回值和参数。

我首先要解决调试/调试场景。堆损坏是一个严重的现有问题的指标,在没有解决之前,您无法保证任何其他场景都能正常工作。事实上,我想说的是,任何其他场景也不会正常工作


另外,我不知道为什么您会认为堆损坏需要通过CRT隔离来解决,而不是dll或exe代码中的问题。dll和exe是否链接到不同版本的CRT?

您好,谢谢您的回复。是的,我知道,已经做好了。例如,由于这个问题,我小心地避免在公共DLL.h文件中使用std。我的DLL代码是完全独立的,只使用基本类型或DLL本身定义的类型,其大小与配置无关。您好,谢谢您的回复。我几乎可以肯定exe和dll中都没有堆损坏问题。他们两人在不同的操作系统和个人电脑下已经在发布/发布配置中工作了数月,没有任何问题。此外,只要删除运算符销毁DLL定义的对象,就会发生崩溃。这个电话是完全合法的,这使我认为它处理了与CRT相关的问题。除此之外,我同意你的看法,我的DLL和EXE现在都在使用同一版本的CRT,所以我可能应该进一步挖掘这个堆损坏。。。