HDF5标识符重复使用前是否需释放?代码场景确认
问题
我正在用C++编写.h5文件,使用HDF5 API调用。HDF5文档指出,这些函数返回的标识符应被释放以防止内存泄漏。
我的代码中多次调用H5Dget_space()覆盖标识符file_space,想确认在再次调用该函数覆盖此标识符前,是否必须先通过H5Sclose(file_space);释放原标识符。我直觉认为无需操作,但希望得到确切结论。
代码示例:
hid_t Acquisition = H5Gopen(fileHandle, "Acquisition/", H5P_DEFAULT); hid_t gp0 = H5Gopen(Acquisition, "GP[0]", H5P_DEFAULT); hid_t dset = H5Dopen(gp0, "RawData/", H5P_DEFAULT); hid_t file_space = H5Dget_space(dset); // ... // Do I need to close `file_space` by `H5Sclose(file_space);` before reusing it in line below? file_space = H5Dget_space(dset); // ... H5Sclose(file_space); H5Dclose(dset); H5Gclose(gp0); H5Gclose(Acquisition); H5Fclose(fileHandle);
答案
必须在再次调用H5Dget_space()覆盖file_space前,先调用H5Sclose(file_space)释放原标识符,否则会造成内存泄漏。
原因很直接:每次调用H5Dget_space()都会生成一个新的HDF5空间标识符,这个标识符对应着底层的资源。如果直接用新的标识符覆盖变量file_space,原来的标识符就会丢失引用,再也无法通过H5Sclose()释放,导致这部分资源一直被占用,最终引发内存泄漏。
修正后的代码示例:
hid_t Acquisition = H5Gopen(fileHandle, "Acquisition/", H5P_DEFAULT); hid_t gp0 = H5Gopen(Acquisition, "GP[0]", H5P_DEFAULT); hid_t dset = H5Dopen(gp0, "RawData/", H5P_DEFAULT); hid_t file_space = H5Dget_space(dset); // ... // 先释放原标识符 H5Sclose(file_space); // 再获取新的标识符 file_space = H5Dget_space(dset); // ... H5Sclose(file_space); H5Dclose(dset); H5Gclose(gp0); H5Gclose(Acquisition); H5Fclose(fileHandle);
内容的提问来源于stack exchange,提问作者Suhaib Ahmad
相关产品推荐
相关产品推荐

