2016-08-04 74 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() 
{} 
相关问题