boost program_options生成一个Klocwork MLK.MUST

时间:2013-09-11 20:31:58

标签: c++ boost

使用一个直截了当的例子,Klocwork insight检测到:

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消息: 内存泄漏。存储在'po :: value&gt;中的动态内存()'通过函数分配',std :: allocator&gt;,std :: allocator,std :: allocator&gt; &GT; &GT; &GT;”第27行在第26行丢失。第26行也有一个类似的错误。

单步进入:value_semantic.hpp,接近第185行(提升1.54),我看到新的():

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 files。

我还没有尝试过另一种内存分析工具(例如,净化)。

1 个答案:

答案 0 :(得分:1)

value_semantic最终由boost::shared_ptr管理。如果在value_semanticnew的构造函数或boost::shared_ptr的构造函数中抛出异常,boost::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将传递给由options_description_easy_init::operator()内的option_description管理的新创建的shared_ptr。在option_description的{​​{3}}内,value_semantic在用于初始化constructor成员变量时由shared_ptr管理。