Безопасно ли использовать исключения во внедренном классе через dll / so? - PullRequest
0 голосов
/ 06 декабря 2011

У меня есть dll или общий объект, MyDll, который создает объект, ForeignObject:

class ForeignObject : public LocalInterface {
  virtual void some_func(Injector& i) {
    i.inject();
  }
};

В интерфейсах выглядит следующим образом.

class Injector {
  virtual void inject() = 0;
};

class LocalInterface {
  virtual void some_func(Injector& i) = 0;
};

Затем я делаю следующее:

class MyInjector : public Injector {
  virtual void inject() {throw std::runtime_error("arrgghh");}
};

int main() {
  LocalInterface* foreign_obj = create_object_from_my_dll();
  MyInjector injector;
  foreign_obj->some_func(injector);
  destroy_object_from_my_dll(foreign_obj);
  return 0;
}

Мой вопрос таков: почему это безопасно / небезопасно , чтобы выдать подобное исключение.Безопасно ли, когда они построены с одним и тем же компилятором?Между компиляторами?

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Я бы сказал, что ответ будет зависеть от ОС.Но для всех UNICES, с которыми я работал (включая Linux и Mac OS X), это будет безопасно.Конечно, вам нужно компилировать компиляторы, использующие тот же ABI, но ABI g ++ не изменился за последние годы (точно не помню, но я думаю, что 3.2 было последним большим изменением).Кроме того, в модели, используемой в Linux, связь не влияет на поведение кода.Таким образом, вы можете смело помещать любой код в динамически связанный файл (т. Е. Файл общего объекта), он будет работать так, как если бы он был связан статически.

В Windows, если вы используете VC ++, вы не сможетескомпилировать вашу библиотеку с другим компилятором.Программа и библиотека должны использовать одну и ту же версию VC ++, совместимость в обоих направлениях отсутствует.Если вы используете g ++, вы можете скомпилировать с другой версией g ++ (как в UNIX), но не с VC ++.Что касается вопроса об этом, то это опасно, я позволю специалисту по Windows ответить, поскольку DLL имеет странное поведение, и если я помню, объект всегда должен быть уничтожен в рамках DLL, которая его загрузила, но я не на 100%точно.

0 голосов
/ 06 декабря 2011

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

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