Передача boost :: ptr_list из библиотеки клиенту - PullRequest
1 голос
/ 15 июля 2009

Я динамически загружаю библиотеку в C ++, как описано здесь .

Мой абстрактный базовый класс выглядит так:

#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 s. С другой стороны, когда список уничтожен, клиент delete вызывается для уничтожения AnotherObject s. Что я могу сделать, чтобы избежать этой проблемы?

Ответы [ 3 ]

3 голосов
/ 15 июля 2009
  1. Используйте std::list<shared_ptr<AnotherObject> >.
  2. Передайте пользовательское средство удаления в shared_ptr, которое вызывает правильное удаление.
0 голосов
/ 15 июля 2009

Лучший способ - один новый оператор удалить и один оператор удалить для всей программы. Есть варианты связывания, которые могут помочь (я помню -Wl, - export-dynamic, но это может быть связано с другой, но связанной с этим проблемой).

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

0 голосов
/ 15 июля 2009

Простой ответ - настаивать на том, чтобы и приложение, и библиотека были скомпилированы с одной и той же версией компилятора, и в этом случае они оба получат одинаковые новые / удаляемые версии.

...