我在返回 a 中的值的引用时遇到了一些麻烦,HashMap<String,String>
该值由 Arc 和 Mutex 包装以在线程之间共享。代码是这样的:
use std::sync::{Arc,Mutex};
use std::collections::HashMap;
struct Hey{
a:Arc<Mutex<HashMap<String, String>>>
}
impl Hey {
fn get(&self,key:&String)->&String{
self.a.lock().unwrap().get(key).unwrap()
}
}
Run Code Online (Sandbox Code Playgroud)
如上所示,代码由于returns a value referencing data owned by the current function
. 我知道lock()
返回 MutexGuard 这是一个局部变量。但是我怎样才能实现这种方法来获取对 HashMap 中的值的引用。如果我不能,Rust 禁止这样做的动机是什么?
让我解释一下为什么 rustc 认为你的代码是错误的。
所以,我对你的代码进行脱糖处理:
fn get(&self,key:&String)->&String{
let lock = self.a.lock().unwrap();
let reference = lock.get(key).unwrap();
drop(lock); // release your lock
// We return reference to data which doesn't protected by Mutex!
// Someone can delete item from hashmap and you would read deleted data
// Use-After-Free is UB so rustc forbid that
return reference;
}
Run Code Online (Sandbox Code Playgroud)
可能您需要使用Arcs
以下值:
#[derive(Default)]
struct Hey{
a:Arc<RwLock<HashMap<String, Arc<String>>>>
}
fn get(&self,key:&String)->Arc<String>{
self.a.lock().unwrap().get(key).unwrap().clone()
}
Run Code Online (Sandbox Code Playgroud)
PS 此外,您可以使用Arc<str>
(我建议这样做),这将使您免于额外的指针间接。它可以从字符串构建:let arc: Arc<str> = my_string.into();
或Arc::from(my_string)
归档时间: |
|
查看次数: |
3645 次 |
最近记录: |