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