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

Что именно произойдет, если я отключу исключения С++ в проекте?

Visual С++ имеет параметр компилятора "Включить исключения С++", который может быть установлен на "Нет". Что именно произойдет, если я это установлю? Мой код никогда явно не бросает или не ловит исключения (и, следовательно, первое исключенное исключение закончит программу в любом случае) и не полагается на стирание стека - следует ли ожидать от нежелательной реакции от перекомпилированной программы?

4b9b3361

Ответ 1

документация MSDN настройки объясняет разные режимы исключений и даже дает примеры кода, чтобы показать разницу между различными режимами. Кроме того, эта статья может быть интересной, хотя она довольно старой.

Нижняя строка: опция в основном включает или отключает отслеживание жизненных циклов всех ваших объектов. Такое отслеживание требуется, потому что в случае исключения все необходимые деструкторы должны быть вызваны, стек должен быть отключен, и выполняется большая очистка. Для такого отслеживания требуются организационные накладные расходы (= дополнительный код) - это можно отбросить, установив опцию "Нет".

Я не пробовал самостоятельно, но похоже, что вы все еще можете использовать исключения throw и catch, если для параметра установлено значение "Нет", но отсутствует очистка и разматывание, что может быть очень плохо последствия (не рекомендуется).

Ответ 2

Компилятор опустит деструкторы и другой код разворачивания стека, который очистится после объектов С++, когда они выйдут из области действия в результате исключения.

Другими словами, он не содержит кучу кода очистки. Этот значительно улучшит производительность, но также приведет к серьезному злу, если на самом деле возникает исключение. (Пора сам, если ты мне не веришь.)

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

Ответ 3

Когда вы укажете "НЕТ" на "Включить исключения С++", тогда не будет выбрана синхронная модель обработки исключений Компилятора (/GX или /EHsc ). В этом режиме размытие семантики не будет включено. То есть объект с автоматическим хранением в кадре, между функцией, выполняющей бросок, и функцией, захватывающей бросок, не будет уничтожен.

Для получения дополнительной информации об обработке исключений можно обратиться к MSDN или Часто задаваемые вопросы об исключении Visual С++.

class Test
{
public:

    Test()
    {
        printf("Test::constructor");
    }
    ~Test()
    {
        printf("Test::Destructor");
    }

};


int _tmain(int argc, _TCHAR* argv[])
{
    int a;

 try
   {
     Test a;
     int* p = 0;
     *p = 0; // Cause access violation
   }
   catch (...)
   {
      printf("Caught access violation"); 
   }
    return 0;
}

с обработкой No для обработки исключений:

Test::constructor
Caught access violation

Ответ 4

У вас по-прежнему будет доступ к управлению структурированными исключениями (SEH), который может обрабатываться __try, __except и __finally.

Обработка исключений С++ - это просто реализация класса, построенная поверх SEH.

Компилятор также будет жаловаться, если вы попытаетесь создать экземпляр классов в функции, которая имеет обработчик исключений SEH (жалуется на объекты, требующие разматывания, т.е. классы), которые могут быть немного грязными, но есть способы обойти это.

Ответ 5

Код, с которым я работал, всегда отключает исключения. Я не видел проблем с повреждением или сбоем ресурсов.

Я думал, что исключения, как правило, плохо подходят для С++. Разрушение стека, особенно с отсутствием GC, делает все исключения болью. И тогда дебаты о том, что "исключительный" действительно означает по сравнению с просто возможностями неудач.

Ответ 6

Что касается стандартного С++, вы получите поведение undefined. Стандарт С++ не допускает возможности исключения исключений в глобальном масштабе, а определенные операции со стандартной библиотекой определяются как бросание исключений при определенных обстоятельствах.

Ответ 7

Если operator new не удается выделить память, я верю, что она вернет NULL вместо того, чтобы бросать исключение std::bad_alloc.

Если вы делаете какие-либо вызовы сторонним библиотекам, которые генерируют исключения, это приведет к большому сбою.