Size: a a a

2020 May 05

NP

Nikita Provotorov in pro.cxx
Constantine Drozdov
А в чем проблема со стандартным?
Да мне нужно без C++17 уметь weak_ptr вытаскивать
источник

CD

Constantine Drozdov in pro.cxx
Андрей
мб там интерфейс типо set_weak_pointer
Там проверка на публичное наследование
источник

А

Андрей in pro.cxx
Constantine Drozdov
Там проверка на публичное наследование
это понятно, но надо же как-то этот вик отправить в обьект
источник

A

Alex in pro.cxx
Nikita Provotorov
Да мне нужно без C++17 уметь weak_ptr вытаскивать
а разве он в 17 появился? Я уже очень давно юзаю
источник

CD

Constantine Drozdov in pro.cxx
Nikita Provotorov
Да мне нужно без C++17 уметь weak_ptr вытаскивать
Хм вы используете его не под шаред? Запретите до 17
источник

NP

Nikita Provotorov in pro.cxx
Constantine Drozdov
Хм вы используете его не под шаред? Запретите до 17
Мне надо в деструкторе weak_ptr вытащить))))
источник

CD

Constantine Drozdov in pro.cxx
Nikita Provotorov
Мне надо в деструкторе weak_ptr вытащить))))
А там убать по логике должно в 17, нет?
источник

A

Alex in pro.cxx
наверное, я чего-то не понял. Что поменялось в С++17 в enabled_shared_from_this?
источник

CD

Constantine Drozdov in pro.cxx
Nikita Provotorov
Мне надо в деструкторе weak_ptr вытащить))))
Вы же в удалении контрол блока, какой вик
источник

NP

Nikita Provotorov in pro.cxx
Constantine Drozdov
А там убать по логике должно в 17, нет?
убает shared_from_this
источник

CD

Constantine Drozdov in pro.cxx
Nikita Provotorov
убает shared_from_this
Там вот прямо сейчас память удаляется делитом, в которую weak должен счётчик писать
источник

NP

Nikita Provotorov in pro.cxx
Constantine Drozdov
Там вот прямо сейчас память удаляется делитом, в которую weak должен счётчик писать
С такой логикой все weak_ptr, пережившие shared_ptr, дожны убать
источник

CD

Constantine Drozdov in pro.cxx
Nikita Provotorov
С такой логикой все weak_ptr, пережившие shared_ptr, дожны убать
Нет, потому что они держат эту память
источник

CD

Constantine Drozdov in pro.cxx
А у вас сейчас счётчик ссылок этой памяти мог быть 0
источник

CD

Constantine Drozdov in pro.cxx
Если была аллокация через make_shared одним блоком
источник

CD

Constantine Drozdov in pro.cxx
В общем, я подозреваю, что доступ на shared_from_this из деструктора это номинальное UB во всех стандартах
источник

NP

Nikita Provotorov in pro.cxx
Ну на cppref написано что это возвращается копия внутреннего weak_ptr
источник

NP

Nikita Provotorov in pro.cxx
А он то не уничтожен еще
источник

CD

Constantine Drozdov in pro.cxx
Nikita Provotorov
Ну на cppref написано что это возвращается копия внутреннего weak_ptr
Я вам могу очень неформально мотивировать, что, поскольку вы находитесь внутри вызова деструктора некоторого shared_ptr и пытаетесь работать с weak_ptr вы нарушаете (не сформулированные) правила по reentrance библиотечных функций; я не вижу явного упоминания на cppref, что будет, но мне совершенно очевидно, что в реализации в моей голове, которая не занулила weak_ptr, это приводит к потенциальным двойным удалениям памяти
источник

CD

Constantine Drozdov in pro.cxx
Nikita Provotorov
А он то не уничтожен еще
В частности, я плохо понимаю реализацию, которая не занулит этот inner_weak перед вызовом деструктора объекта
источник