+ Ответить в теме
Показано с 1 по 6 из 6

Тема: DLL

  1. #1
    senior developer Kolinus is on a distinguished road
    Регистрация
    23.08.2004
    Адрес
    Минск
    Сообщений
    464
    Вес репутации
    15

    По умолчанию DLL

    Доброгго времени суток.
    Вопрос:
    //main.cpp
    class A
    {
    int a();
    virtual void b();
    }

    //dll.cpp
    class B : public A
    {
    void b();
    }

    из главного приложения загружаю длл. вызываю функцию, которая возвращает мне указатель на объект класса B
    выгружаю длл, не удаляя возвращенный объект.
    после этого
    из приложения вызываю
    b->a() - все работает
    b->b() - эксепшн.
    В чем проблема ?
    В SAD - все в SAD.

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    37
    Сообщений
    3,091
    Вес репутации
    22

    По умолчанию

    Какой exception именно?
    Entites should not be multiplied beyond necessity @ William Occam
    ---
    Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
    ---
    Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

  4. #3
    senior developer Kolinus is on a distinguished road
    Регистрация
    23.08.2004
    Адрес
    Минск
    Сообщений
    464
    Вес репутации
    15

    По умолчанию

    Access violation
    В общем прокунсультировался еще с парой человек сказали что скорее всего фишка в том что при выгрузке длл разрушается виртуальная таблицп вызовов функций для данного объекта.
    Есть соображения ?
    В SAD - все в SAD.

  5. #4
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    37
    Сообщений
    3,091
    Вес репутации
    22

    По умолчанию

    Отследи в дебагере таблицу виртуальных методов, если подозрения подтвердятся и она окажется битой - выгружай DLL тогда, когда объект уже не нужен.
    Entites should not be multiplied beyond necessity @ William Occam
    ---
    Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
    ---
    Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

  6. #5
    Moderator Куратор
    system architect
    Eugie is on a distinguished road
    Регистрация
    17.02.2004
    Адрес
    SPb
    Сообщений
    707
    Вес репутации
    17

    По умолчанию

    Kolinus, при выгрузке DLL ты теряешь доступ к коду, реализущему соотв.виртуальную функцию. Сама-то vtable остается при объекте, только указатели на методы в ней становятся инвалидными.

  7. #6
    senior developer Kolinus is on a distinguished road
    Регистрация
    23.08.2004
    Адрес
    Минск
    Сообщений
    464
    Вес репутации
    15

    По умолчанию

    понятно.
    Спасибо
    В SAD - все в SAD.

+ Ответить в теме

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения