0

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

多变的:

boost::optional<Cacher> cacher_;

来自核心的第 5 帧:

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

在这一帧中执行的行是:

cacher_ = boost::none;

结果,导致崩溃的几帧指向提升库代码:

#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::noneto的结果cacher_,对象会被销毁吗?

如果诊断问题的详细信息不足,请致歉。我将尝试根据回复提供更多详细信息。

谢谢!

4

1 回答 1

1

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

如果你分配boost::none(或调用.reset())它会正确地销毁它持有的对象,如果有的话。

这同样适用(据我所知,分配std::optional除外)。boost::none

于 2016-10-13T05:45:13.317 回答