C# 正确处理未更改的结构

C# 正确处理未更改的结构,c#,unmanaged,C#,Unmanaged,你好,这是一个问题的延续。下面提供了将数据加载到结构中的代码的简短版本。HDF5DotNet库是使用vs2015的32位版本找到的。我的问题是,当有人调用HDF5GetSubGroups时,MyStruct是否会泄漏内存 using HDF5DotNet; namespace CommonClass { public class HDF5FileReader { public static List<string> HDF5G

你好,这是一个问题的延续。下面提供了将数据加载到结构中的代码的简短版本。HDF5DotNet库是使用vs2015的32位版本找到的。我的问题是,当有人调用HDF5GetSubGroups时,MyStruct是否会泄漏内存

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函数应返回一个错误或某个错误字符串。如果是这种情况,您不需要释放字符串。