Export (0) Print
Expand All
Expand Minimize

Compiler Warning (level 3) C4823

Error Message

'function' : uses pinning pointers but unwind semantics are not enabled. Consider using /EHa

To unpin an object on the managed heap pointed to by a pinning pointer declared in a block scope, the compiler simulates the behavior of destructors of local classes, "pretending" the pinning pointer has a destructor that nullifies the pointer. To enable a call to a destructor after throwing an exception, you must enable object unwinding, which you can do by using /EHsc.

You can also manually unpin the object and ignore the warning.

Example

The following sample generates 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 );
}

C4823 can also be generated using /clr:oldSyntax. The following sample generates C4823.

// C4823_b.cpp
// compile with: /clr:oldSyntax /W3 /EHa-
using namespace System;

__gc struct G {
   int m;
};

void f(G* pG) {
   try {
      int __pin* p = &pG->m;
      // manually unpin, ignore warning
      // p = 0;
      throw new Exception;
   }
   catch(Exception*) {}
}   // C4823

int main() {
   f( new G );
}

Community Additions

ADD
Show:
© 2014 Microsoft