仅在调试模式下的向量取消分配期间,从dll在\u ASSERTE(\u acrt\u first\u block==头)中断言 我在C++中创建了MyCudi.dll,下面是DLL的pSuDO代码。 /* CommLayerIF.h */ #include "CommLayerImpl.h" enum class COMM_LAYER { COMM_LAYER1, COMM_LAYER2 } typedef std::vector<COMM_LAYER> CommLayers; CommLayerIF* CreateCommLayerIFInstance() { return new CommLayerIF(); } class CommLayerIF { public: /*! \brief Constructor */ CommLayerIF(); /*! \brief Destructor */ virtual ~CommLayerIF() override; __declspec(dllexport) int SetLayers(CommLayers CommunicationLayers); private: CommLayerImpl* m_commLayerImpl; }; 下面是动态加载此DLL的应用程序

仅在调试模式下的向量取消分配期间,从dll在\u ASSERTE(\u acrt\u first\u block==头)中断言 我在C++中创建了MyCudi.dll,下面是DLL的pSuDO代码。 /* CommLayerIF.h */ #include "CommLayerImpl.h" enum class COMM_LAYER { COMM_LAYER1, COMM_LAYER2 } typedef std::vector<COMM_LAYER> CommLayers; CommLayerIF* CreateCommLayerIFInstance() { return new CommLayerIF(); } class CommLayerIF { public: /*! \brief Constructor */ CommLayerIF(); /*! \brief Destructor */ virtual ~CommLayerIF() override; __declspec(dllexport) int SetLayers(CommLayers CommunicationLayers); private: CommLayerImpl* m_commLayerImpl; }; 下面是动态加载此DLL的应用程序,c++,dll,C++,Dll,/*MyApp.cpp*/ #include "CommLayerIF.h" int main(int argc, char *argv[]) { { //Create comm layer instance from dll CommLayerIF *pComm = CreateCommLayerIFInstance(); std::vector<COMM_LAYER> commLayers; commLayers.resize(2); c

/*MyApp.cpp*/

#include "CommLayerIF.h"

int main(int argc, char *argv[]) {
{
    //Create comm layer instance from dll
    CommLayerIF *pComm = CreateCommLayerIFInstance();
    std::vector<COMM_LAYER> commLayers;
    commLayers.resize(2);
    commLayers[0] = COMM_LAYER::COMM_LAYER1;
    commLayers[1] = COMM_LAYER::COMM_LAYER2;

    int status = pComm->SetLayers(commLayers); 
    ....
}
#包括“CommLayerIF.h”
int main(int argc,char*argv[]){
{
//从dll创建通信层实例
CommLayerIF*pComm=CreateCommLayerIFInstance();
std::矢量通信层;
commLayers.resize(2);
commLayers[0]=COMM_LAYER::COMM_LAYER1;
commLayers[1]=COMM_LAYER::COMM_LAYER2;
int status=pComm->SetLayers(commLayers);
....
}
SetCommLayers(CommLayers)API按值获取向量,并在内部将向量传递给另一个函数。应用程序动态链接dll并调用SetCommLayer()API,但当从API返回时,它在向量解除分配过程中根据以下原因从debug_heap.cpp断言:

_ASSERTE(uuu acrt_ufirst_ublock==标题)

注意:这个问题是在调试模式下发现的。我曾尝试使用多线程调试Dll(/MDd)选项构建应用程序和Dll,但它仍然在调试模式下断言。
请让我知道它失败的原因?这个问题有什么解决方案吗?

这段代码在发布模式下运行良好,但在调试模式下断言。这可能是错误的想法。断言仅在调试模式下有效。在发布模式下不提醒问题并不意味着它不存在。我同意。我会更正这句话。但为什么它失败?我是simp请用一个小的信息来发送向量。很难用这个小信息来猜测。更新的源代码示例,你是否认为你可以使用调试APPL来运行调试DLL。或者释放DLL。此外,两者都必须使用相同版本的MSVC++进行编译。
#include "CommLayerIF.h"

int main(int argc, char *argv[]) {
{
    //Create comm layer instance from dll
    CommLayerIF *pComm = CreateCommLayerIFInstance();
    std::vector<COMM_LAYER> commLayers;
    commLayers.resize(2);
    commLayers[0] = COMM_LAYER::COMM_LAYER1;
    commLayers[1] = COMM_LAYER::COMM_LAYER2;

    int status = pComm->SetLayers(commLayers); 
    ....
}