释放非托管内存中分配的内存失败!!!!!怎么弄
c#吧
全部回复
仅看楼主
level 1
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());
}
2018年01月06日 06点01分 1
level 7
[滑稽]
2018年01月06日 07点01分 2
[滑稽]
2018年01月06日 07点01分
level 1
因为 你的指针 改变了值, 而要删除的 指针 理论是个常量
2018年01月06日 12点01分 3
什么意思?/ 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); 你是说这里吗/
2018年01月08日 05点01分
1