Re[8]: Exception from dll -> dll unload -> AV
От: ndemia Россия http://ndemia.com
Дата: 05.12.11 16:26
Оценка:
Здравствуйте, Amor, Вы писали:

A>
A>main()
A>{
A>   try
A>   {
A>      RunProgram();
A>   }
A>   catch( std::exception& e )
A>   {
A>      std::cout << "Exception occured: " << e.what() << std::endl;
A>   }
A>}
A>


A>Я говорю, что этот код понятия не имеет о том, кто какой компонент там грузит, и далее — какие библиотеки грузит компонент, которого загрузили, и т.д. и т.п.


Этот — не имеет. Другой, может, будет иметь. Какая разница?
Например, есть вызов e.what(). Из этого кода не следует, что это не my_exception::what(). Т.е. данный код имеет реальный шанс вызвать код my_exception, не имея об этом никакого понятия. С точки зрения ООП/Си++ никто его ругать за это права не имеет. А вот с точки зрения организации процесса, если мы перед этим выгрузим код функции my_exception::what — всё накроется. Хотя объект my_exception будет ещё жив, и его VTBL в порядке.


A>А ты, так понимаю предлагаешь примерно следующее


A>
A>main()
A>{
A>   ScopedLoadLibrary lib1( "component1.dll" );
A>   ScopedLoadLibrary lib2( "component2.dll" );
A>   ScopedLoadLibrary lib3( "component3.dll" );
A>   try
A>   {
A>      RunProgram();
A>   }
A>   catch( std::exception& e )
A>   {
A>      std::cout << "Exception occured: " << e.what() << std::endl;
A>   }
A>}
A>


Ну, если по простому, то да.
По жизни это может быть кучерявее.
Типа так:


ScopedLoadLibrary* plib = new ScopedLoadLibrary( "component1.dll" );
SomeFunc()
{
   bool f_plib_condemn = false;
   try
   {
      RunProgram();
   }
   catch( std::exception& e )
   {
      std::cout << "Exception occured: " << e.what() << std::endl;
      f_plib_condemn = true;
   }
   if(f_plib_condemn)
   {
      delete plib;
   }
}

потому что это может быть не main (программа может работать дальше), и условие может быть более сложным (например, можно ещё дождаться завершения каких-нибудь тредов и т.п.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.