2016-08-04 61 views
0

考慮一下這個功能:複製的boost :: program_options :: parsed_options

po::parsed_options ParserClass::parseOptions(int argc, char *argv[]) { 
    return po::command_line_parser(argc, argv) 
      .options(desc) 
      .positional(pos) 
      .run(); 
} 

descposParserClass成員變量。

此函數是否安全或返回parsed_options對象的指針指向釋放的空閒存儲器內存,因爲當函數返回時釋放原始對象的分配內存?

你怎麼知道語義?我嘗試閱讀源代碼以查明,但對我來說有點神祕。該文件似乎沒有告訴。

如果該功能不安全,該如何解決?您是否應該擴展課程並定義移動操作?

回答

2

如果對象可以被複制或移動,它可以基本上意味着三兩件事:

  1. 操作被明確定義和行爲安全
  2. 圖書館作者已經搞砸了複製/移動是虐待表現爲
  3. 您在使用時必須遵循一些不明顯的約定(通常是由於性能原因)。

隨着升壓(和它如此廣泛使用的零件爲program_options),我們可以排除第二個選項,併爲第三個,你可以諮詢documentation看到沒有什麼可笑的存在。

如果你真的想知道argv指針不逃避功能(我想這是唯一可疑的地方有),可以檢查相應的basic_command_line_parser構造函數將其複製到通過detail::make_vectorstd::string S(向量: )

template<class charT> 
basic_command_line_parser<charT>:: 
basic_command_line_parser(int argc, const charT* const argv[]) 
: detail::cmdline(
    // Explicit template arguments are required by gcc 3.3.1 
    // (at least mingw version), and do no harm on other compilers. 
    to_internal(detail::make_vector<charT, const charT* const*>(argv+1, argv+argc+!argc))), 
    m_desc() 
{} 
相關問題