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

释放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)可能没有释放内部结构体,不能解决问题

    打赏 评论
  • threenewbee 2018-10-18 01:50

    释放内存不会将指针设置为0,也不会将释放的内存填0。因此释放以后还能访问能访问到很正常。

    打赏 评论

相关推荐 更多相似问题