正在复制 boost::program_options::parsed_options
Copying 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();
}
desc
和pos
是ParserClass
的成员变量。
这个函数安全吗 return 一个 parsed_options
对象,它的指针指向释放的空闲存储内存,因为当函数 returns 时,原始对象分配的内存被释放?
你怎么知道语义?我试图阅读源代码以找出答案,但这对我来说有点神秘。文档好像没说。
如果功能不安全,如何修复?您应该扩展 class 并定义移动操作吗?
如果对象可以复制或移动,基本上可以表示三件事:
- 操作定义明确且行为安全
- 图书馆作者搞砸了,copy/move 行为不端
- 您在使用它时必须遵循一些非显而易见的约定(通常是由于性能原因)。
有了 boost(以及其中广泛使用的部分 program_options
)我们可以排除第二个选项,对于第三个选项,您可以参考 documentation 看看没有什么那里可笑。
如果你真的想知道 argv
指针没有转义函数(我猜这是那里唯一可疑的地方),你可以检查相应的 basic_command_line_parser
构造函数将它复制到std::string
的向量(通过 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()
{}
考虑这个函数:
po::parsed_options ParserClass::parseOptions(int argc, char *argv[]) {
return po::command_line_parser(argc, argv)
.options(desc)
.positional(pos)
.run();
}
desc
和pos
是ParserClass
的成员变量。
这个函数安全吗 return 一个 parsed_options
对象,它的指针指向释放的空闲存储内存,因为当函数 returns 时,原始对象分配的内存被释放?
你怎么知道语义?我试图阅读源代码以找出答案,但这对我来说有点神秘。文档好像没说。
如果功能不安全,如何修复?您应该扩展 class 并定义移动操作吗?
如果对象可以复制或移动,基本上可以表示三件事:
- 操作定义明确且行为安全
- 图书馆作者搞砸了,copy/move 行为不端
- 您在使用它时必须遵循一些非显而易见的约定(通常是由于性能原因)。
有了 boost(以及其中广泛使用的部分 program_options
)我们可以排除第二个选项,对于第三个选项,您可以参考 documentation 看看没有什么那里可笑。
如果你真的想知道 argv
指针没有转义函数(我猜这是那里唯一可疑的地方),你可以检查相应的 basic_command_line_parser
构造函数将它复制到std::string
的向量(通过 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()
{}