неверная память при использовании классов из dll

63
5

это первый раз, когда я пытался экспортировать класс из dll. что я сделал: - сформировал интерфейс (только чистые виртуальные методы) - реализовал этот интерфейс в DLL с классом, который не будет экспортироваться - класс имеет метод выпуска, который вызывает delete на его этом указателе, - создал класс Factory с статическим методом, который возвращает указатель на конкретный класс, но как интерфейс. этот класс экспортируется. - удаление возвращаемого объекта выполняется путем вызова метода его выпуска.

Я все это извлек из этого урока о классах в dll.

Проблема в том, что когда я использую эту DLL в другом проекте, все идет нормально, пока я не вызову функцию release на объекте. Затем он показывает окно с ошибкой утверждения с сообщением "_ASSERTE (_BLOCK_TYPE_IS_VALID (pHead-> nBlockUse));

Это случилось с кем-то еще? Я знаю, что это так же просто, как забыть использовать std :: при запуске C++, но, как я уже сказал, я только начал это.

Благодарю!

спросил(а) 2021-01-25T16:18:45+03:00 4 месяца, 4 недели назад
1
Решение
100

Определяется ли ваша заводская функция в заголовке? Если это так, и new для создания объекта находится в заголовке, тогда вызов delete изнутри DLL может вызвать эту ошибку. Функцию фабрики необходимо экспортировать с помощью DLL, только объявление должно появиться в заголовке.

Например, ваш заголовок должен выглядеть так:


class MyInterface 
{
public:
virtual void DoSomething() = 0;

virtual ~MyInterface() {}
};

__declspec(dllexport) MyInterface * __stdcall MyInterfaceFactory();

Реализация MyInterfaceFactory() должна содержаться в DLL.

ответил(а) 2021-01-25T16:18:45+03:00 4 месяца, 4 недели назад
-4

Спасибо за ваши ответы, и я сожалею, что начал это зря!

Проблема была очень простой, но скрытой за интерфейсами, фабрикой и некоторыми другими вещами. Я возвращал указатель на объект, который был объявлен как статический, потому что он должен быть одиночным. Затем я пытался освободить этот объект. BANG куча коррупции !!

В моем одиночном объекте не должно быть функции выпуска, в первую очередь; Я разрешу это, извлекая функцию release в отдельный интерфейс, который будет реализован только не статическими объектами.

ответил(а) 2021-01-25T16:18:45+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема