Advertencia del compilador (nivel 3) C4823
"function": usa punteros anclados, pero la semántica de desenredado no está habilitada. Considere la posibilidad de usar /EHa
Para desanclar un objeto en el montón administrado al que apunta un puntero de anclaje declarado en un ámbito de bloque, el compilador simula el comportamiento de destructores de clases locales, "fingiendo" que el puntero de anclaje tiene un destructor que anula al puntero. Para habilitar una llamada a un destructor después de generar una excepción, debe habilitar el desenredado de objetos, lo que puede hacer mediante /EHsc.
También puede desanclar manualmente el objeto y omitir la advertencia.
Ejemplo
El ejemplo siguiente genera la advertencia 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 );
}