Как реализовать dll с сохранением состояния в c ++ - PullRequest
0 голосов
/ 10 ноября 2019

(извините, не возможно отправить код)

При реализации DLL, есть преимущества отсутствия состояния. Примером является видеоанализ, где результат зависит от последних кадров. У операций dll есть состояние (= последние кадры). Однако это состояние основано на памяти, поэтому оно может принадлежать вызывающей стороне, и DLL остаются без сохранения состояния.

Однако, вы не всегда можете оставить dll без состояния. Рассмотрим библиотеку DLL, которая зависит от другой сторонней библиотеки DLL с состоянием . Это состояние может быть основано на GPU, потоках и коммуникационных ресурсах. Вы не хотите подвергать вызывающего абонента этой другой сторонней DLL, поэтому вам нужно (изнутри вашей DLL) поддерживать состояние.

Как бы это было достигнуто наиболее элегантно и эффективноиспользование c ++ внутри dll?

Моя текущая реализация имеет класс с именем DllContext. DllContext создается только один раз, когда-либо будет только один объект. Существует статический указатель типа DllContext*, который будет удерживать этот объект в течение всего времени его существования. Статика здесь означает область действия: она определяется вне какого-либо тела функции, а не части какого-либо класса. Он доступен только из минимального файла, который определяет 3 точки входа dll:

dll init(): создать объект с помощью new

dll deInit(): удалить объект с помощью delete

dll doWork(): вызов соответствующего doWork() объекта DllContext

Мне не нравится это решение. Я бы сказал, что это не одноэлементное решение , потому что объект доступен только из одного минимального файла. Тем не менее, все еще безобразно, какие-либо предложения?

1 Ответ

0 голосов
/ 10 ноября 2019

У вас не так много вариантов. Позвоните init при первом вызове без сохранения состояния. Используйте небольшой статический объект-обертку вместо простого указателя DllContext, чтобы иметь возможность вызвать deInit в своем деструкторе. Или даже не беспокойтесь о deInit. Зачем убирать дом, чтобы его снести? Если только на самом деле нет причины, которая не "предотвращает утечки памяти".

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