Поделиться через


Ошибка компилятора C2712

не может использоваться __try в функциях, требующих очистки объекта

Замечания

Ошибка C2712 может возникать при использовании /EHsc, а функция с структурированной обработкой исключений также содержит объекты, требующие очистки (уничтожения).

Возможные решения:

  • переместите код, для которого требуется SEH, в другую функцию;

  • заново напишите функции, использующие SEH, чтобы избежать использования локальных переменных и параметров с деструкторами; не используйте SEH в конструкторах и деструкторах;

  • компилируйте код без параметра /EHsc.

Ошибка C2712 также может возникать при вызове метода, объявленного с помощью ключевого __event слова. Так как событие может использоваться в многопоточной среде, компилятор создает код, который предотвращает обработку базового объекта события, а затем заключает созданный код в инструкциюtry-finally Поэтому ошибка C2712 может возникнуть, если вызвать метод события и передать аргумент, тип которого содержит деструктор. Одно из решений в данном случае — передача аргумента в качестве константной ссылки.

C2712 также может возникать при компиляции и /clr:pure объявлении статического массива указателей на функции в блоке __try . Для статического элемента компилятору требуется использовать динамическую инициализацию, /clr:pureкоторая подразумевает обработку исключений C++. Однако обработка исключений C++ не допускается в блоке __try.

/clr:pure Параметры /clr:safe компилятора устарели в Visual Studio 2015 и не поддерживаются в Visual Studio 2017.

Пример

В следующем примере создается C2712 и показано, как исправить его.

// C2712.cpp
// compile with: /clr:pure /c
struct S1 {
   static int smf();
   void fnc();
};

void S1::fnc() {
   __try {
      static int (*array_1[])() = {smf,};   // C2712

      // OK
      static int (*array_2[2])();
      array_2[0] = smf;
    }
    __except(0) {}
}