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 типа?
Обсуждают сегодня