4

簡単な例を使用すると、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 メッセージ: メモリ リーク。27 行目の関数 'value,std::allocator >,std::allocator,std::allocator > > > >' によって割り当てられた 'po::value > ()' に格納されている動的メモリは、26 行目で失われます。 26行目の同様のエラーの1つです。

内部のシングルステップ: 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最終的に によって管理されるようになり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フリーストアに a を割り当てます。をオプションとして追加すると、value_semanticは新しく作成された に渡され、内option_descriptionで管理されます。のコンストラクター内で、メンバー変数の初期化に使用されたときに、によって管理されるようになります。shared_ptroptions_description_easy_init::operator()option_descriptionvalue_semanticshared_ptrm_value_semantic

于 2013-09-12T15:19:41.137 に答える