Я пытаюсь понять некоторые детали, полученные из файла ядра, в отношении переменной 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
, а сбой - из-за того, что память, хранящаяся в объекте, уже освобождена.
Мой вопрос:
- Свидетельствует ли
boost::optional
, что память, удерживаемуюcacher_
действует? - В результате присвоения
boost::none
доcacher_
будет ли объект уничтожен?
Извините, если детали для диагностики проблемы недостаточны. Я попытаюсь предоставить дополнительные данные на основе ответов.
Спасибо!
'(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
Я не думаю, что * valid * является правильным необязательный, пустой, в нем нет объекта. Вид вроде пустого 'unique_ptr' (необязательно очень похож на умный указатель, но мы используем его для ясности). – krzaq
Хорошо. В данном случае, что мы имеем пытаться уничтожить, когда нет объекта? В любом случае, правильно ли назначить 'boost :: none', не проверяя, инициализирован ли' cacher_' или нет? – Maddy