liulangdelangzi 2018-10-18 01:22 采纳率: 50%
浏览 2420
已采纳

释放intptr内存资源,是不是应该对内存清零?再次用这块内存的时候会返回上一次的数据

C#调用C++的dll时候用到的类

                public struct DBCSignal
    { 
             ...
        public Byte multiplexer_value;

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
        public Byte[] unit;


        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
        public Byte[] strName;

        //[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 201)]
        public Byte[] strComment;


        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
        public Byte[] strValDesc;
    }
        public struct DBCMessage
    {
                public UInt32 nSize;   

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
        public DBCSignal[] vSignals; 

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
        public byte[] strName;

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 201)]
        public byte[] strComment;
    }

结构体传递的时候用到intptr指针

 IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(DBCMessage)));
if (DBC_GetFirstMessage(m_hDBC,pt))
            {
                DBCMessage msg = (DBCMessage)Marshal.PtrToStructure(pt, typeof(DBCMessage));
                m_vMsg.Add(msg);
                                Marshal.FreeHGlobal(pt);//释放内存
                                while (DBC_GetNextMessage(m_hDBC,pt))
                {          
                    msg = (DBCMessage)Marshal.PtrToStructure(pt, typeof(DBCMessage));
                                        this.dataGridView1.Rows[index1].Cells[9].Value = Regex.Replace(System.Text.Encoding.Default.GetString(msg.strComment), @"\0", string.Empty);
                                        //怀疑再次用Marshal.PtrToStructure会把上一次的数据传给msg
                                }

在循环的时候Marshal.PtrToStructure为什么会把上一次循环的数据又传给msg呢?能不能把pt所指内存清零呢?

  • 写回答

2条回答 默认 最新

  • liulangdelangzi 2018-10-18 01:43
    关注

    自己刚才试了在循环末尾加上Marshal.DestroyStructure可以释放
    用Marshal.FreeHGlobal(pt)可能没有释放内部结构体,不能解决问题

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器