Подтверждение из dll in_ASSERTE (__ acrt_first_block == заголовок) во время удаления вектора только в режиме отладки - PullRequest
0 голосов
/ 24 февраля 2020

Я создал MyComm.dll в c ++, ниже приведен псевдокод dll.

/* 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;
};

Ниже приведена реализация CommLayerIf

/ * CommLayerIF. cpp * /

#include "CommLayerIF.h"    

int
CommLayerIF::SetLayers(CommLayers CommunicationLayers)
{
    //This function only reads vector and creates layers. It asserts after return.
    int status = m_commLayerImpl.SetLayers(CommLayers); 

    return status;
}
  • Ниже приведено приложение, загружающее эту 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);
    commLayers[0] = COMM_LAYER::COMM_LAYER1;
    commLayers[1] = COMM_LAYER::COMM_LAYER2;

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

SetCommLayers (CommLayers) API, принимающий вектор по значению, и он внутренне передает вектор другой функции. Приложение динамически связывает dll и вызывает API-интерфейс SetCommLayer (), но при возврате из API оно утверждает во время освобождения вектора по следующей причине из debug_heap. cpp,

_ASSERTE (__ acrt_first_block == header);

Примечание. Эта проблема возникает в режиме отладки. Я пытался построить приложение и Dll с многопоточными опциями Debug DLL (/ MDd), но все же он утверждает в режиме отладки. Пожалуйста, дайте мне знать, почему это не удается? Есть ли решение этой проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...