【问题标题】:Copying boost::program_options::parsed_options复制 boost::program_options::parsed_options
【发布时间】:2016-08-04 12:40:52
【问题描述】:

考虑这个函数:

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

descposParserClass 的成员变量。

这个函数是安全的还是返回一个parsed_options 对象,该对象的指针指向释放的空闲存储内存,因为函数返回时释放了原始对象分配的内存?

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

如果函数不安全,如何修复?是否应该扩展类并定义移动操作?

【问题讨论】:

    标签: c++ boost boost-program-options


    【解决方案1】:

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

    1. 这些操作定义明确且运行安全
    2. 图书馆作者搞砸了,复制/移动行为不端
    3. 在使用它时,您必须遵循一些不明显的约定(通常是出于性能原因)。

    使用 boost(以及其中广泛使用的部分,如 program_options),我们可以排除第二种选择,而对于第三种选择,您可以咨询documentation,看看那里没有什么可笑的。

    如果你真的想知道argv指针没有转义函数(我猜这是那里唯一可疑的地方),你可以检查对应的basic_command_line_parser构造函数将其复制到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()
    {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      相关资源
      最近更新 更多