厉害厉害🐼 只为love祢
关注数: 32 粉丝数: 71 发帖数: 1,264 关注贴吧数: 38
释放非托管内存中分配的内存失败!!!!!怎么弄 void LoadDeviceList() { dt.Clear(); IntPtr pDomainRouteList = IntPtr.Zero; IntPtr tmpRoute = IntPtr.Zero; try { int SIZE_OF_IVS_DOMAIN_ROUTE_LIST = Marshal.SizeOf(typeof(IVS_DOMAIN_ROUTE_LIST)); int SIZE_OF_IVS_DOMAIN_ROUTE = Marshal.SizeOf(typeof(IVS_DOMAIN_ROUTE)); int bufferSize = SIZE_OF_IVS_DOMAIN_ROUTE_LIST + 127 * SIZE_OF_IVS_DOMAIN_ROUTE; pDomainRouteList = Marshal.AllocHGlobal(bufferSize); //获取整个系统的域路由信息,域路由信息的最大数目为128 Debug.WriteLine("IVS_SDK_GetDomainRoute"); int result = IVS_API.IVS_SDK_GetDomainRoute(iSession, pDomainRouteList, (uint)bufferSize); //this.ConsoleLog("IVS_SDK_GetDomainRoute: resultCode = " + result); if (result != 0) { Debug.WriteLine("IVS_SDK_GetDomainRoute Error resultCode = " + result); } else { Debug.WriteLine("IVS_SDK_GetDomainRoute: resultCode = " + result); //从非托管内存封送数据到对应的托管类中 IVS_DOMAIN_ROUTE_LIST data = (IVS_DOMAIN_ROUTE_LIST)Marshal.PtrToStructure(pDomainRouteList, typeof(IVS_DOMAIN_ROUTE_LIST)); if (data.uiTotal > 0) { tmpRoute = Marshal.AllocHGlobal(SIZE_OF_IVS_DOMAIN_ROUTE); byte[] tmpBts = new byte[SIZE_OF_IVS_DOMAIN_ROUTE]; for (int index = 0; index < data.uiTotal; index++) { //copy to bts pDomainRouteList = new IntPtr(pDomainRouteList.ToInt64() + SIZE_OF_IVS_DOMAIN_ROUTE_LIST + SIZE_OF_IVS_DOMAIN_ROUTE * (index - 1)); Marshal.Copy(pDomainRouteList, tmpBts, 0, SIZE_OF_IVS_DOMAIN_ROUTE); //copy to intptr Marshal.Copy(tmpBts, 0, tmpRoute, SIZE_OF_IVS_DOMAIN_ROUTE); IVS_DOMAIN_ROUTE route = (IVS_DOMAIN_ROUTE)Marshal.PtrToStructure(tmpRoute, typeof(IVS_DOMAIN_ROUTE)); DataRow dr = dt.NewRow(); dr["DomainCode"] = new string(route.cDomainCode).Trim('\0'); dr["SuperDomain"] = new string(route.cSuperDomain).Trim('\0'); dr["DomainName"] = route.cDomainName; dr["NodeType"] = "1"; dt.Rows.Add(dr); //获取指定域设备列表 GetDomainDevice(new string(route.cDomainCode).Trim('\0')); //获取指定域设备组列表信息 GetDomainDeviceGroup(new string(route.cDomainCode).Trim('\0'), "0"); } } } } catch (Exception ex) { Debug.WriteLine("IVS_SDK_GetDomainRoute Exception.Error:" + ex.ToString()); MessageBox.Show(ex.ToString()); } try { //释放从非托管内存中分配的内存 这里无法释放 直接catch报错 if (pDomainRouteList != IntPtr.Zero) { Marshal.FreeHGlobal(pDomainRouteList); } if (tmpRoute != IntPtr.Zero) { Marshal.FreeHGlobal(tmpRoute); } } catch (Exception ex) { Debug.WriteLine("IVS_SDK_GetDomainDeviceList Marshal.FreeHGlobal:" + ex.ToString()); MessageBox.Show(ex.ToString()); }
1 下一页