Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Missuses

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 11. Boost.DLL

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext
[Warning] Warning

Типичные ошибки и ошибки находятся в этом разделе. Пожалуйста, внимательно прочитайте, это сэкономит много времени на отладку!

  • Вопрос:Программа падает на<delete>или<free()>.
  • Исправить:Ваш плагин и программа должны использовать одни и те же библиотеки стандарта C++ и C, оба должны быть связаны динамически. Для Visual Studio используют коммутаторы/MD или/MDd компилятора.

  • Выпуск:Программные сбои в<catch(...)>блоке.
  • Пример:<
    try{
       autof=dll::import<int()>(path_to_pugin,"function");
       f();
       // `f` goes out of scope
    }catch(conststd::exception&e){
       std::cerr<<e.what();
    }
    
    >
  • Исправление:Исключение было создано внутри плагина, поэтому оно относится к коду исключения в плагине. Когда<f>выходит из области действия, плагин разгружается, и ссылка на код исключения нарушается. Любая попытка использовать переменную исключения может использовать ссылку на свисание, что приводит к сбою сегментации. Исправьте свой код:<
    autof=dll::import<int()>(path_to_pugin,"function");
    try{
       f();
       // `f` goes out of scope
    }catch(conststd::exception&e){
       std::cerr<<e.what();
    }
    
    >

  • Вопрос:Нить локального хранилища, кажется, повреждена.
  • Исправление:Некоторые платформы не имеют встроенной поддержки плагинов, использующих TLS, напримерWindows. Используйте специальные обходные пути платформы или просто не используйте TLS в плагинах.

  • Проблема:Попытка вызвать загруженную функцию приводит к сбоям или функция возвращает неправильный результат.
  • Исправление:Повышение. DLL не гарантирует стабильность ABI. Если вы компилируете плагин и программу с различными компиляторами или коммутаторами, функция ABI может измениться, и вы получите неправильный код.

  • Выпуск:Программа падает после разгрузки плагина.
  • Пример:<
    voidfoo(){
       shared_ptr<int>p;
       try{
           autof=dll::import<shared_ptr<int>()>(path_to_pugin,"function");
           p=f();
           // `f` goes out of scope
       }catch(conststd::exception&e){
           std::cerr<<e.what();
       }
       std::cout<<*p;
       // crashes here
    }
    
    >
  • Исправление:В данном случае проблема находится в пределах<shared_ptr<int>>. Он сохраняет стертый тип удаления, код для этого удаления находится в плагине. При уничтожении<p>,<shared_ptr<int>>предпринимаются попытки вызвать этот удалитель, однако плагин уже был выгружен и код для удалителя больше не доступен.
  • Правило большого пальца:: Если ваш метод плагина возвращает какую-либо переменную класса C++, убедитесь, что плагин загружается до тех пор, пока эта переменная и любые ее копии не будут в объеме.
  • Типичные классы, которые вызывают такие ошибки:
    • <any>
    • <function>
    • <shared_ptr>
    • любой контейнер с полиморфным распределителем
    • <std::type_index>
    • <std::type_info>
    • <std::exception_ptr>
    • <std::unique_ptr<Base>>Держащий<Derived>тип плагина
    • Классы исключений, выброшенные из плагина


PrevUpHomeNext

Статья Missuses раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 11. Boost.DLL может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 11. Boost.DLL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:01:19/0.028830051422119/1