unique_ptr<mutex> mtx;
SomeClass * const parent;
SomeClass(SomeClass *parent) : pointer(nullptr), mtx(nullptr), parent(parent)
{
assert(parent != nullptr);
parent->mtx->lock();
}
SomeClass(SomeClass&& parent) = default;
~SomeClass()
{
if(parent != nullptr)
parent->mtx->unlock();
}
SomeClass() : pointer(nullptr), mtx(new mutex), parent(nullptr)
{ pointer.reset(new T); }
SomeClass aquire()
{ return SomeClass{this}; }
T* get()
{
if(parent != nullptr)
return pointer.get();
throw new exception();
}
};
При вызове aquire от объекта, все unique_ptr-ы обнуляют свои ссылки. Что я делаю не так?
как вы это выяснили?
Я обнаружил это, когда начал отлаживаться после краша. Класс тут один, я всего лишь решил, что пора заменить обычные указатели на unique_ptr'ы.
ну по примеру SomeClass x; auto y = x.acquire(); assert(x.pointer != nullptr); assert(y.pointer == nullptr); assert(y.get() == nullptr);
Как работает конструктор перемещения? Вы в деструкторе проверяете обычный указатель))
T* get() { if(parent != nullptr) return pointer.get(); //в этой строке точно нет ошибки? может, parent->pointer.get() throw new exception(); }
Он падает на assert(x.pointer != nullptr);
Моя невнимательность. Но ошибка возникает раньше.
Да, а что с ним не так?
Вы точно уверены, что он обнулит parent?
parent — константный указатель, он не обнуляется.
Я бы копал в сторону mtx в parent. И как насчёт отладчика?
https://godbolt.org/z/TEEj68EnP
Окей. Ничего не ясно, но очень интересно. Исправил на parent->pointer.get() и перестало падать на assert(root.pointer != nullptr).
В любом случае, у вас SomeClass совмещает одновременно две сущности - acquire должен вернуть другой тип
Стоит разделить на 2 типа?
Обсуждают сегодня