编译器警告(等级 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 );
}