C# 非托管内存释放失败!!!!! 直接上代码 求解决!!!!!!

彭十一。 2018-01-06 03:20: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());
}
...全文
450 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2018-01-07
  • 打赏
  • 举报
回复
1、pDomainRouteList 两次malloc 一次 free 2、 IVS_API.IVS_SDK_GetDomainRoute函数修改没有pDomainRouteList情况不明!
彭十一。 2018-01-06
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
你上代码我们也测试不了啊,不如看看使用非托管资源的api有没有相应的方法。
对这些东西不是特别熟悉...........实习生 暂时解决了问题可以跑,
exception92 2018-01-06
  • 打赏
  • 举报
回复
你上代码我们也测试不了啊,不如看看使用非托管资源的api有没有相应的方法。

110,525

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧