使用一个直截了当的例子,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。
我还没有尝试过另一种内存分析工具(例如,净化)。
答案 0 :(得分:1)
value_semantic
最终由boost::shared_ptr
管理。如果在value_semantic
,new
的构造函数或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
管理。