问题
using a straightforward example, Klocwork insight detects:
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 message: Memory leak. Dynamic memory stored in 'po::value > ()' allocated through function 'value,std::allocator >,std::allocator,std::allocator > > > >' at line 27 is lost at line 26. Also there is one similar error on line 26.
Single-step inside: value_semantic.hpp, near line 185 (boost 1.54), I see new():
typed_value<T>* r = new typed_value<T>(v);
Looking inside: options_description.hpp, near line 70, I see an empty destructor
option_description::~option_description()
{
}
I do not see an obvious location where a delete is called, in the boost\boost_1_54_0\boost\program_options\detail*hpp files.
I have not tried another memory analysis tool (e.g., purify) as of yet either.
回答1:
The value_semantic eventually becomes managed by a boost::shared_ptr. The value_semantic will leak if an exception is thrown in new, boost::shared_ptr's constructor, or boost::program_options::option_description's constructor.
With the following code:
namespace po = boost::program_options;
po::options_description desc("Options");
desc.add_options()
("name", po::value<std::string>(), ...) // add option
;
boost::program_options::value() will allocate a value_semantic in the free store. When added as an option, the value_semantic is passed to a newly created option_description, managed by a shared_ptr within options_description_easy_init::operator(). Within option_description's constructor, the value_semantic becomes managed by a shared_ptr when it used to initialize the m_value_semantic member variable.
来源:https://stackoverflow.com/questions/18750691/boost-program-options-generating-a-klocwork-mlk-must