Поскольку происходит сбой в операторе удаления, и поскольку вы сказали, что компилируете с /MT
, я считаю, что причина в том, что ваши две библиотеки DLL не разделяют одну и ту же кучу: потому что каждая из них ссылается на статическая библиотека, каждый из которых получает свою собственную копию кучи во время выполнения; и вы эффективно выделяете память в одной DLL из одной кучи и удаляете память в другой DLL из другой кучи.
Чтобы обойти это, вы можете объявить, что деструктор защищен, и не экспортировать его. Вместо этого создайте статическую функцию уничтожения:
class A
{
public:
__declspec( dllexport ) static void destroy(A* self) { delete self; }
protected:
virtual ~A() {}
};
int main()
{
B* b = new B();
A::destroy(b); //instead of delete b
return 0;
}
В качестве альтернативы, и вы можете предпочесть это, потому что это не связано с изменением исходного кода, убедитесь, что обе библиотеки DLL собраны с использованием одной и той же кучи, то есть с использованием версий DLL среды выполнения C, что, я думаю, означает использование Опция /MD
вместо /MT
.