2016-10-13 2 views
0

Я пытаюсь понять некоторые детали, полученные из файла ядра, в отношении переменной boost :: optional type.Нужно уточнить на boost :: optional type

Переменная:

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_ будет ли объект уничтожен?

Извините, если детали для диагностики проблемы недостаточны. Я попытаюсь предоставить дополнительные данные на основе ответов.

Спасибо!

ответ

1

Да, boost::optional отслеживает, содержит ли он действительный объект. Это можно проверить, используя operator bool() или is_initialized().

Если вы назначили boost::none (или позвоните по телефону .reset()), он правильно уничтожит объект, который он держит, если таковой имеется.

То же самое относится к std::optional (за исключением boost::none присвоения, насколько мне известно).

+0

'(gdb) frame 3 # 3 присваивать (this = 0x32557590) в/opt/include/boost/optional/optional.hpp: 313 313 void assign (none_t) {destroy(); } (gdb) p * this $ 9 = { = {<Нет полей данных>}, m_initialized = false, m_storage = {dummy_ = { data = ".................. ...................... ", Aligner_ = {<Нет полей данных>}}}}' Указывает, что объект «m_initialized = false» указывает на то, что объект недействителен? – Maddy

+0

Я не думаю, что * valid * является правильным необязательный, пустой, в нем нет объекта. Вид вроде пустого 'unique_ptr' (необязательно очень похож на умный указатель, но мы используем его для ясности). – krzaq

+0

Хорошо. В данном случае, что мы имеем пытаться уничтожить, когда нет объекта? В любом случае, правильно ли назначить 'boost :: none', не проверяя, инициализирован ли' cacher_' или нет? – Maddy