Я динамически загружаю библиотеку на C++, как описано here.Передача boost :: ptr_list из библиотеки клиенту
Мой абстрактный базовый класс выглядит следующим образом:
#include <boost/ptr_container/ptr_list.hpp>
class Base {
public:
virtual void get_list(boost::ptr_list<AnotherObject>& list) const = 0;
};
И моя библиотека теперь обеспечивает производный класс Derived
class Derived : public Base { ... };
void Derived::get_list(boost::ptr_list<AnotherObject& list) const {
list.push_back(new AnotherObject(1));
list.push_back(new AnotherObject(2));
}
и create
и destroy
функции
extern "C" {
Base* create() { new Derived; }
destroy(Base* p) { delete p; }
}
Моя программа-клиент загружает библиотеку и два create
и destroy
функции. Затем он создает экземпляр Derived
и использует его:
Base* obj = create();
boost::ptr_list<AnotherObject> list;
obj->get_list(list);
Теперь моя проблема: Когда список заполняется библиотека библиотеки new
призвана создать AnotherObject
с. С другой стороны, когда список уничтожается, клиентский delete
вызывается для уничтожения AnotherObject
. Что я могу сделать, чтобы избежать этой проблемы?
Это часть системы плагинов. У каждой библиотеки есть, вероятно, ее собственное новое/удаление. Кроме того, я хочу собрать все мои объекты AnotherObjects в клиент-глобальный список.Таким образом, я также должен собрать все deleter ... – phlipsy
Вам не нужно выполнять шаг 2. Просто используйте 'shared_ptr'.« Волшебно »знает, для чего« delete' ». –
Должно быть только одно deleter в exe, клиентские DLL не будут знать, как память удаляется. Идея состоит в том, чтобы создать все объекты внутри вашего основного exe и передать в качестве параметра shared_ptr deleter функцию, которая вызывает удаление из cpp lib exe. – rpg