Можете ли вы преобразовать адрес памяти в размер usize в ссылку с продолжительностью жизни?

#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 Метод на указателях также является опцией.