4

使用一个简单的示例,Klocwork 洞察力检测到:

namespace po = boost::program_options;
po::options_description oArgDesc("Options");
oArgDesc.add_options()
("sN", po::value<vector<string>>()->required()->multitoken(), "List of destination names.")
("sV", po::value<vector<string>>()->required()->multitoken(), "List of source names.")
;

Klocwork 消息:内存泄漏。在第 27 行通过函数 'value,std::allocator >,std::allocator,std::allocator > > > > 分配的 'po::value > ()' 中存储的动态内存在第 26 行丢失。还有是第 26 行的一个类似错误。

单步内:value_semantic.hpp,在第 185 行附近(提升 1.54),我看到 new():

typed_value<T>* r = new typed_value<T>(v);

往里看:options_description.hpp,在第 70 行附近,我看到一个空的析构函数

option_description::~option_description()
{
}

在 boost\boost_1_54_0\boost\program_options\detail*hpp 文件中,我没有看到调用删除的明显位置。

到目前为止,我还没有尝试过其他内存分析工具(例如,purify)。

4

1 回答 1

2

最终value_semantic由 a 管理boost::shared_ptr。如果在、的构造函数或的构造函数value_semantic中抛出异常,则会泄漏。newboost::shared_ptrboost::program_options::option_description

使用以下代码:

namespace po = boost::program_options;
po::options_description desc("Options");
desc.add_options()
  ("name", po::value<std::string>(), ...) // add option
  ;

boost::program_options::value()value_semantic在免费存储中分配一个。当作为一个选项添加时,value_semantic被传递给一个新创建的option_description,由一个shared_ptrinside管理options_description_easy_init::operator()。在option_description构造函数中,当它用于初始化成员变量时,它value_semantic变为由 a 管理。shared_ptrm_value_semantic

于 2013-09-12T15:19:41.137 回答