为啥这段代码会泄露? (简单的代码片段)

Posted

技术标签:

【中文标题】为啥这段代码会泄露? (简单的代码片段)【英文标题】:Why does this code leak? (simple codesnippet)为什么这段代码会泄露? (简单的代码片段) 【发布时间】:2012-11-06 18:40:22 【问题描述】:

Visual Studio 向我显示了几个泄漏(几百行),总共超过几 MB。我将其追溯到以下“helloWorld 示例”。 如果我注释掉 H5::DataSet.getSpace() 行,泄漏就会消失。

#include "stdafx.h"
#include <iostream>
#include "cpp/H5Cpp.h"

int main(int argc, char *argv[])

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); // dump leaks at return

H5::H5File myfile;
try 
    myfile = H5::H5File("C:\\Users\\yyy\\myfile.h5", H5F_ACC_RDONLY);

catch (H5::Exception& e) 
    std::string msg( std::string( "Could not open HDF5 file.\n" ) + e.getCDetailMsg() );
    throw msg;


H5::Group myGroup = myfile.openGroup("/so/me/group");
H5::DataSet myDS = myGroup.openDataSet("./myfloatvec");
hsize_t dims[1];
//myDS.getSpace().getSimpleExtentDims(dims, NULL); // <-- here's the leak

H5::DataSpace dsp = myDS.getSpace(); // The H5::DataSpace seems to leak
dsp.getSimpleExtentDims(dims, NULL);
//dsp.close(); // <-- doesn't help either

std::cout << "Dims: " << dims[0] << std::endl; // <-- Works as expected

return 0;

任何帮助将不胜感激。我已经研究了好几个小时了,我讨厌不干净的代码……

【问题讨论】:

什么是 HS::H5File ?你能显示定义什么是 dsMean.getSpace.getSimpleExtentDims 定义吗? 我们需要更多代码。 H5::DataSpace::getSpace() 到底是做什么的? 对不起,我认为这很明显,但显然不是。这些是来自 HDF5 库的 C++ 接口的函数。就是这个:hdfgroup.org/HDF5/doc/cpplus_RM/classH5_1_1DataSet.htmlgetSpace() 返回 DataSpace 的副本,我可以在其中获取数据的维度。 也许有类似 releaseSpace... 【参考方案1】:

使用完后使用H5::DataSet::vlenReclaim回收内存。

【讨论】:

嗯,我现在已经看过了,我必须说我不太明白。我能找到的唯一远程有用的是hdfgroup.org/ftp/HDF5/current/src/unpacked/c++/test/tvlstr.cpp,但我现在知道发生了什么以及如何在我更简单的代码中使用它。 我仍然无法解决这个问题或理解这个例子。我非常欢迎任何额外的帮助。【参考方案2】:

可变长度回收仅在您使用可变长度数据类型时才适用,我认为您不会在此示例中使用。我认为您只需要在使用完数据空间后关闭它即可。

【讨论】:

以上是关于为啥这段代码会泄露? (简单的代码片段)的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个代码片段说包含错误?

为啥此代码片段返回意外结果?

收藏|分享前端开发常用代码片段

Xcode 8 Autocomplete Broken - 仅显示有限的用户代码片段 - 知道为啥吗?

为啥尽管源代码没有变化,但从一个系统到另一个系统的片段数量却有很大差异?

为啥代码片段在 matplotlib 2.0.2 上运行良好,但在 matplotlib 2.1.0 上引发错误