需要澄清boost :: optional类型

时间:2016-10-13 05:43:33

标签: c++ boost-optional

我试图从与核心文件相关的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::none分配给cacher_,对象是否会被销毁?
  3. 如果诊断问题的详细信息不充分,请道歉。我会尝试根据回复提供更多详细信息。

    谢谢!

1 个答案:

答案 0 :(得分:1)

是的,boost::optional会跟踪它是否包含有效对象。可以使用operator bool()is_initialized()来检查此内容。

如果您指定boost::none(或调用.reset()),它将正确销毁它所拥有的对象(如果有)。

对于std::optional也是如此(据我所知,boost::none作业除外)。