c++ - 复制 boost::program_options::parsed_options

标签 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. 操作明确且行为安全
  2. 图书馆作者搞砸了,复制/移动行为不端
  3. 您在使用它时必须遵循一些非显而易见的约定(通常是由于性能原因)。

有了 boost(以及它的广泛使用部分,如 program_options),我们可以排除第二个选项,对于第三个选项,您可以引用 documentation看看那里没有什么可笑的。

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

关于c++ - 复制 boost::program_options::parsed_options,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38767613/

相关文章:

c++ - 为什么新版本的 odeint 会失败?

c++ - 在 C++ 中合并两个 boost 侵入集?

c++ - 可移植代码的程序选项库

c++ - boost::program_options :迭代并打印所有选项

c++ - 从构造函数中抛出异常的奇怪格式

c++ - 用于 C++ 类变量的 OpenMP

multithreading - boost 互斥量 C++/CLI 问题

c++ - 在 C++ 中及时求解 ODE 系统

c++:程序设置 - boost.PropertyTree 或 boost.program_options?

c++ - 如何调整 std::vector<std::queue<std::unique_ptr<int>>> 的大小?