エラー メッセージ
'関数' : ピンされたポインタを使用していますが、アンワインド セマンティクスは有効にはなりません。/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 );
}
C4823 は /clr:oldSyntax の使用でも生成されることがあります。次の例では 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 );
}