#winapi #rust
#Ржавчина #небезопасный
Вопрос:
Я знаю, что мы можем использовать ссылку -gt; необработанный указатель -gt;gt; адрес ( gt; gt; usize
), но можем ли мы сделать это в обратном направлении, особенно с пожизненными аннотациями? Например, у меня есть следующий код:
struct Namelt;'agt; { name: amp;'a str, } impllt;'agt; Namelt;'agt; { fn to_addrlt;'bgt;(amp;'b self) -gt; usize { /* ... */ } fn from_addrlt;'bgt;(address: usize) -gt; amp;'b Namelt;'agt; { // assuming the address is valid, // is this even possible to return an reference with both lifetimes? } }
Ответ №1:
Это так unsafe
, но да:
fn from_addrlt;'bgt;(address: usize) -gt; amp;'b Namelt;'agt; { unsafe { amp;*(address as *const Self) } }
Вы должны самостоятельно обеспечить требования к безопасности памяти Rust: указатель должен быть ненулевым, не зависающим, выровненным, без изменяемых псевдонимов и т. Д. Помимо обеспечения правильности времени жизни.
Я бы на самом деле отметил всю эту функцию, unsafe
поскольку срок 'b
службы (и в зависимости от использования 'a
) определяется на сайте вызова. Абонент должен знать, что существуют гарантии, которые он должен обеспечить, чтобы безопасно использовать его.
unsafe fn from_addrlt;'bgt;(address: usize) -gt; amp;'b Namelt;'agt; { amp;*(address as *const Self) }
Комментарии:
1.
as_ref
Метод на указателях также является опцией.