C语言 释放hdf5库分配的内存

0s7z1bwu  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(204)

我正在运行一个c库,它动态分配内存并从h5文件加载一个字符串数组。
我在使用后释放内存时出错,我不确定这是Windows的问题还是我没有做正确的事情。
对于Windows,我使用Visual Studio C编译器(2019),hdf5库的版本是1.12

{
    unsigned mode        = H5F_ACC_RDONLY;
    char     file_name[] = "d1.h5";

    // assume a priori knowledge of dataset name and size
    char dset_name[] = "/group_name/daset_name";
    char**  elts = calloc(10, sizeof(char*));

    hid_t file = H5Fopen(file_name, mode, H5P_DEFAULT));
    hid_t dset = H5Dopen2(file, dset_name, H5P_DEFAULT);
    hid_t h5_type = H5Tcopy(H5T_C_S1);
    herr_t ret = H5Tset_size(h5_type, H5T_VARIABLE);

    // read all dataset elements
    H5Dread(dset, h5_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, elts);

    H5Tclose(dset);
    H5Dclose(dset);
    H5Fclose(file);

    // elts would be something like
    //    "asdf"
    //    "asdff"
    //    "asdfwer"
    //    "asdfffasdf"
    //    "asd"
    //    "asdf"
    //    "asdff"
    //    "asdfwer"
    //    "asdfffasdf"
    //    "asd"

    // do something w/ the dataset elements

    // after working free memory
    for(size_t i = 0; i < 10; i++) {
        free(elts[i]); // fails on this line
    }
    free(elts); // this line does not fail

}

此代码仅在调试模式下的Windows上失败,在发布时它可以工作。程序退出,错误为:

minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp(908): Assertion failed: is_block_type_valid(header->_block_use)
unknown file: error: SEH exception with code 0xc0000005 thrown in the test body
gopyfrb3

gopyfrb31#

了解this RFC的含义后。我在HDF5库中找到了专门用于此目的的方法文档。
根据文档,大部分内存管理福尔斯在使用HDF5的用户端,也就是说,当从文件加载数据时,通常会首先分配内存,然后HDF5会用数据填充分配的内存。
在一些情况下,HDF5分配一些存储器(即,当使用字符串数组时),并且内存必须由分配它的相同组件释放。由于Windows C运行时dll的特殊情况,会出现一些堆损坏问题。因此,从1.8.13版本开始,HDF5库中已实现了释放此内存的方法。
我将把文档链接到方法。HDF5_freemory()

相关问题