我试图从与核心文件相关的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
的析构函数的地方,崩溃是因为对象持有的内存已被释放。
我的问题:
boost::optional
是否表明cacher_
占有的内存有效?boost::none
分配给cacher_
,对象是否会被销毁?如果诊断问题的详细信息不充分,请道歉。我会尝试根据回复提供更多详细信息。
谢谢!
答案 0 :(得分:1)
是的,boost::optional
会跟踪它是否包含有效对象。可以使用operator bool()
或is_initialized()
来检查此内容。
如果您指定boost::none
(或调用.reset()
),它将正确销毁它所拥有的对象(如果有)。
对于std::optional
也是如此(据我所知,boost::none
作业除外)。