复制boost :: program_options :: parsed_options

时间:2016-08-04 12:40:53

标签: c++ boost boost-program-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对象,该对象的指针指向已释放的空闲存储内存,因为当函数返回时会释放原始对象的已分配内存?

你怎么知道语义?我试着阅读源代码以找出答案,但这对我来说有点神秘。文档似乎没有说明。

如果功能不安全,怎么修好?你应该扩展类并定义一个移动操作吗?

1 个答案:

答案 0 :(得分:2)

如果可以复制或移动对象,它基本上意味着三件事:

  1. 操作定义明确且行为安全
  2. 图书馆作者搞砸了,复制/移动是不正常的
  3. 使用时必须遵循一些非显而易见的约定(通常是出于性能原因)。
  4. 使用boost(以及广泛使用的部分program_options)我们可以排除第二个选项,对于第三个选项,您可以咨询documentation以确定那里没有任何荒谬的选择

    如果你真的想知道argv指针没有转义函数(我猜它是那里唯一可疑的地方),你可以检查相应的basic_command_line_parser构造函数是否将它复制到一个向量中of std::string s(通过detail::make_vector:)

    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()
    {}