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

C#会自动释放非托管指针吗?还是需手动释放?

C++ DLL对象在C#窗体中的内存释放问题解答

C#的垃圾回收(GC)仅负责管理托管内存(比如C#自身创建的对象),对于通过C++ DLL在非托管堆上分配的内存,GC完全无法感知,因此必须手动调用seqGen_Delete释放内存,否则必然触发C++侧的内存泄漏预警。

具体实现方案:绑定窗体FormClosed事件释放内存

在窗体关闭时释放C++对象是合理的处理时机,具体步骤如下:

  1. 在窗体类中保存C++对象的指针(避免局部变量被GC回收导致丢失指针):
private IntPtr _seqPtr = IntPtr.Zero;
  1. 在合适时机(比如窗体加载时)创建C++对象:
// 示例:在Form_Load事件中创建
private void YourForm_Load(object sender, EventArgs e)
{
    _seqPtr = seqGen_Create();
}
  1. 绑定FormClosed事件处理函数,在事件中释放内存:
// 在窗体构造函数中绑定事件
public YourForm()
{
    InitializeComponent();
    this.FormClosed += YourForm_FormClosed;
}

private void YourForm_FormClosed(object sender, FormClosedEventArgs e)
{
    // 检查指针不为空再释放,避免重复释放导致崩溃
    if (_seqPtr != IntPtr.Zero)
    {
        seqGen_Delete(_seqPtr);
        _seqPtr = IntPtr.Zero;
    }
}

如果需要更严谨的资源管理,也可以让窗体类实现IDisposable接口,同时在终结器(Finalizer)中做兜底释放,但对于普通窗体场景,绑定FormClosed事件已经足够简单可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:01:03