C# 正确处理未更改的结构
你好,这是一个问题的延续。下面提供了将数据加载到结构中的代码的简短版本。HDF5DotNet库是使用vs2015的32位版本找到的。我的问题是,当有人调用HDF5GetSubGroups时,MyStruct是否会泄漏内存C# 正确处理未更改的结构,c#,unmanaged,C#,Unmanaged,你好,这是一个问题的延续。下面提供了将数据加载到结构中的代码的简短版本。HDF5DotNet库是使用vs2015的32位版本找到的。我的问题是,当有人调用HDF5GetSubGroups时,MyStruct是否会泄漏内存 using HDF5DotNet; namespace CommonClass { public class HDF5FileReader { public static List<string> HDF5G
using HDF5DotNet;
namespace CommonClass
{
public class HDF5FileReader
{
public static List<string> HDF5GetSubGroups(string filePath)
{
var returnList = new List<string>();
//... some HDF5 instantiating -- commented out for brevity
var myStruct = new MyStruct[numberOfThingsToRead];
H5A.read(someAttribute, someAttributeType, new H5Array<MyStruct>(myStruct));
string myStructVariableString = IntPtrToString(myStruct[0].intPtr);
returnList.Add(myStructVariableString);
//... closing some HDF5 instantiating -- commented out for brevity
return returnList
}
private string IntPtrToString(IntPtr ipp)
{
string s = Marshal.PtrToStringAnsi(ipp)
//need to free ipp?
return s;
}
}
public struct MyStruct
{
public Int int1;
public IntPtr intPtr;
}
}
namespace CallerClass
{
public class SomeCallerClass()
{
string someFilePath = "Path\To\HDF5File.h5"
var stringList = HDF5FileReader.HDF5GetSubGroups(someFilePath)
//Do Something with StringList -- add to observablecollection
}
public class UnloadingSomeCallerClass()
{
//Clear the observablecollection
}
}
使用HDF5DotNet;
命名空间公共类
{
公共类HDF5FileReader
{
公共静态列表HDF5GetSubGroups(字符串文件路径)
{
var returnList=新列表();
//…一些HDF5实例化--为了简洁起见,注释掉了
var myStruct=new myStruct[numberOfThingsToRead];
读取(someAttribute,someAttributeType,新的H5Array(myStruct));
字符串myStructVariableString=IntPtrToString(myStruct[0].intPtr);
returnList.Add(myStructVariableString);
//…关闭一些HDF5实例化--为了简洁起见,注释掉了
退货清单
}
专用字符串IntPtrToString(IntPtr ipp)
{
字符串s=Marshal.PtrToStringAnsi(ipp)
//需要释放ipp吗?
返回s;
}
}
公共结构MyStruct
{
公共Int int1;
公共IntPtr IntPtr;
}
}
命名空间调用程序类
{
公共类SomeCallerClass()
{
string someFilePath=“Path\To\HDF5File.h5”
var stringList=HDF5FileReader.HDF5GetSubGroups(someFilePath)
//使用StringList执行一些操作--添加到observablecollection
}
公共类UnloadingSomeCallerClass()
{
//清除可观察到的集合
}
}
我读了你的另一个问题,仍然不确定你为什么需要MyStruct
。根据HDF5DotNet库,您可以只使用字符串
或char[]
@CodingYoshi。我读取HDF5文件中可变长度字符串的唯一方法是使用intptr并使用Interop.Marshal将其转换为.NET字符串。我相信我以前尝试过string和char[],但它没有返回写入h5文件的正确字符串。好的,我明白了。请参阅。请在读取指针之前尝试关闭该文件,好吗?如果在H5A.read
调用之后直接放置H5A.close
,则marshall函数应返回一个错误或某个错误字符串。如果是这种情况,您不需要释放字符串。