ссылка будет жить до завершения процесса?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b19b23eaeaa1081d183d70fdfd0d6eca
Да
Если приходиться использовать transmute для изменения срока жизни на ststic, значит что то в программе неправильно, и это можно выполнить без static
Нет
Почему?
Потому что ничто не мешает дропнуть v и словить УБ
А если я уверен что v живет до завершения процесса?
Лучше доказать это компилятору сейфовыми методами
Не знаю как доказывать, ансейф и ffi, отрезок кода приложить не могу - слишком много выйдет
Если есть в наличии не ссылка, а сама штуковина на которую оно ссылается, то можно в бокс завернуть, ликнуть и сделать статическую ссылку, она по идее уже точно никуда не убежит. А наличие просто ссылки ничего не гарантирует, потом случайно в другой контейнер переложится и ссылка невалидная станет.
Тогда лучше не пытаться обмануть компилятор, а просто перейти на raw pointers. Это, как не странно, будет более безопасно, так как не будет давать ложных надежд и заставит быть начеку 😂
А точнее?
Само преобразование безопасно. Просто использование может привести к UB
Плохой совет, сырые указатели не содержат лайфтаймы
Вот именно. Это лучше чем обманывать компилятор и расширять время жизни. Если уверен что живет вечно, то вперёд, используй сырые указатели Он же уверен что время жизни 'static
Box::leak — это не обман компилятора
Конкретно box leak нет, так как освобождения не будет. Но он то меняет время жизни конкретной ссылки, а не владеющей структуры
Но трансмутить лайфтаймы вроде само по себе не уб
было задано условие «если уверен, что будет жить до конца процесса»
Обсуждают сегодня