gpt4 book ai didi

rust - 将 *mut 分配给 LocalKey

转载 作者:行者123 更新时间:2023-11-29 08:16:42 25 4
gpt4 key购买 nike

use std::thread;
use std::ptr::null_mut;

struct Foo;

thread_local!(static F: *mut Foo = std::ptr::null_mut());

fn main() {
let foo = Foo;
F.with(|f|{
f = std::ptr::null_mut();
//f = foo as *mut Foo;
});
}
src/main.rs:234:13: 234:33 error: mismatched types [E0308]
src/main.rs:234 f = std::ptr::null_mut();
^~~~~~~~~~~~~~~~~~~~
src/main.rs:234:13: 234:33 help: run `rustc --explain E0308` to see a detailed explanation
src/main.rs:234:13: 234:33 note: expected type `&*mut Foo`
src/main.rs:234:13: 234:33 note: found type `*mut _`

with 定义为

fn with<F, R>(&'static self, f: F) -> R 
where F: FnOnce(&T) -> R

如何在 with 中将新的 *mut 分配给 f

use std::thread;
use std::ptr::null_mut;
use std::cell::*;

#[derive(Debug)]
struct Foo{
i: i32
}

thread_local!(static F: Cell<*mut Foo> = Cell::new(std::ptr::null_mut()));

fn main() {
let mut foo = Foo{i : 42};
let foop = &mut foo as *mut Foo;
F.with(|f|{
let mut f1 = f.get();
println!("{:?}", f1);
f1 = foop;
});
F.with(|f|{
println!("{:?}", f.get());
});
}

我现在使用 Cell 来绕过编译错误,但问题是打印了以下内容:

0x0
0x0

这意味着我没有将新的可变指针分配给线程局部变量 F

最佳答案

您必须使用 Cell(类似于 examples ):

use std::ptr;
use std::cell::Cell;

struct Foo;

thread_local!(static F: Cell<*mut Foo> = Cell::new(ptr::null_mut()));

fn main() {
// let mut foo = Foo;
F.with(|f| {
f.set(ptr::null_mut());
// Don't do this, you can generate a use after free if foo is dropped
// f.set(&mut foo);
});
}

在示例中使用了 RefCell,但是由于 *mut 实现了 Copy,使用的 Cellsufficient

关于rust - 将 *mut 分配给 LocalKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37882516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com