Подтвердить что ты не робот

Бросание исключений С++ через границы DLL

Я читал разные вещи о том, как нельзя распределять кучную память в одной DLL и освобождать ее из-за пределов этой DLL. Но как насчет бросания объекта исключения, который является просто временным (как и большинство объектов исключения)? Например:.

throw my_exception( args ); // temporary: no heap allocation

Когда объект исключения попадает за пределы DLL, деструктор для этого объекта будет в конечном итоге выполнен, и память без кучи для объекта будет восстановлена. Это нормально, так как это не куча памяти?

4b9b3361

Ответ 1

Выбрасывание исключений С++ через границы DLL возможно только тогда, когда все модули используют ту же среду выполнения С++, и в этом случае они также имеют кучу. Но это может быть бременем обслуживания, особенно когда задействованы библиотеки от нескольких поставщиков, поэтому он не рекомендуется.

Если вы хотите, чтобы обработка ошибок, переносимая в разных версиях компилятора/компилятора/компилятора, использовала коды возврата или исключения из ОС (например, SEH в Windows)/

Ответ 2

Это зависит от того, как была распределена эта память и является ли механизм для этого ( "среда выполнения" или "диспетчер памяти" ) разделяется между конкретной DLL и другими частями приложения. Например. a throw new my_exception( args ); также может быть в порядке в зависимости от деталей.

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

Использование IMalloc (см. MSDN), например, размещение и размещение new было бы другим способом (вызов OleInitialize раньше)...

Действительно, распределение памяти является проблемой в зависимости от того, что используется. Например, смешивание статически связанных CRT и динамически связанных CRT в разных частях приложения приведет к проблемам так же, как и код смешивания и отладки. Проблема в том, что в коде, который должен освобождать память, используется другой "менеджер памяти". Но если брошенный объект знает о его собственном разрушении, это должно быть хорошо, поскольку dtor-код будет находиться в том же компиляционном блоке, что и тот, который его выделяет.