Я создал 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), но все же он утверждает в режиме отладки. Пожалуйста, дайте мне знать, почему это не удается? Есть ли решение этой проблемы?