编译器警告(等级 3)C4823
“function”:使用固定指针,但未启用展开语义。 考虑使用 /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 );
}