Предупреждение компилятора (уровень 3) C4823
Функция: использует указатели на закрепление, но семантика очистки не включена. Рассмотрите возможность использования /EHa
Чтобы открепить объект в управляемой куче, на которую указывает указатель на закрепление, объявленный в области блока, компилятор имитирует поведение деструкторов локальных классов, "притворяющийся" указатель на закрепление имеет деструктор, который null уведомляет указатель. Чтобы включить вызов деструктора после создания исключения, необходимо включить очистку объекта, который можно сделать с помощью /EHsc.
Вы также можете вручную открепить объект и игнорировать предупреждение.
Пример
В следующем примере возникает ошибка C4823.
// C4823.cpp
// compile with: /clr /W3 /EHa-
using namespace System;
ref struct G {
int m;
};
void f(G ^ pG) {
try {
pin_ptr<int> p = &pG->m;
// manually unpin, ignore warning
// p = nullptr;
throw gcnew Exception;
}
catch(Exception ^) {}
} // C4823 warning
int main() {
f( gcnew G );
}