You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

抛出Exception时,fixed语句能否正确完成清理工作?

关于fixed块自动清理的官方保障确认

你完全猜对了!fixed 块的行为确实和 using 语句或者手动编写的 try...finally 结构一致——不管代码块是正常执行完毕,还是因为 return 跳转、异常抛出等情况提前终止,CLR都会自动帮你解除对内存指针的固定,让GC可以正常回收这块内存区域。

官方规范的明确保障

在C#语言规范中,已经明确规定了fixed块的编译行为:编译器会自动将fixed块转换为包含finally的结构——当你进入fixed块时,CLR会锁定指定的内存区域,防止GC移动它;当代码以任何方式离开fixed块(包括异常、return、break等),finally中的清理逻辑都会自动执行,解除对内存的固定。

不需要额外添加try..catch

你完全没必要在每个fixed块中手动添加try..catch来处理指针的解除固定操作,因为fixed本身已经内置了这种安全机制。只有当你需要在块内处理特定异常逻辑时,才需要额外添加try..catch,但指针的清理工作完全由CLR自动完成,不用你操心。

举个简单的例子验证:

unsafe void FixedBlockDemo()
{
    int[] data = new int[5];
    fixed (int* ptr = data)
    {
        // 即使这里抛出异常,ptr也会被自动解除固定
        throw new InvalidOperationException("测试异常");
    }
}

在这个例子中,异常抛出后,fixed块的清理逻辑会自动触发,内存的固定状态会被解除,GC依然可以正常工作。

内容的提问来源于stack exchange,提问作者Michael Stum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:20:42