需要澄清boost::可选类型

Need clarification on boost::optional type

本文关键字:类型 boost      更新时间:2023-10-16

我正试图从核心文件中获得关于boost::可选类型变量的一些细节。

变量:

boost::optional<Cacher> cacher_;

Frame #5 from core:

(gdb) p this->cacher_
$1 = boost::optional

在这一帧中执行的行是:

cacher_ = boost::none;
因此,导致崩溃的几个帧指向boost库代码:
#1  0x000000000152f96c in destroy_impl (this=0x32557590) at /opt/include/boost/optional/optional.hpp:479
#2  destroy (this=0x32557590) at /opt/include/boost/optional/optional.hpp:439
#3  assign (this=0x32557590) at /opt/include/boost/optional/optional.hpp:313
#4  operator= (none_=NULL, this=0x32557590) at /opt/include/boost/optional/optional.hpp:615

第0帧是Cacher的析构函数被调用的地方,崩溃是因为对象持有的内存已经被释放了。

我的问题:

  1. boost::optional表示cacher_持有的内存有效吗?
  2. 如果将boost::none赋值给cacher_,对象会被销毁吗?

如果诊断问题的细节不充分,请道歉。我会尽量根据回复提供更多细节。

谢谢!

是的,boost::optional跟踪它是否持有一个有效的对象。这可以通过使用operator bool()is_initialized()来检查。

如果你赋值boost::none(或调用.reset()),它将正确地销毁它保存的对象,如果有的话。

同样适用于std::optional(除了boost::none的赋值,据我所知)。

相关文章: