问题描述
我试图准确地了解何时可以让类型实现 Send
,而这在 Rust nomicon 中并不是很清楚。
具体来说,我有一个包含 Builder
的构建器结构(比如 Vec<*mut std::os::raw::c_char>
):
pub struct Builder{
list: Vec<*mut std::os::raw::c_char>,}
这些指针实际上来自一个解构的std::ffi::CString
(通过使用std::ffi::CString::into_raw
)。因此,这些指针实际上由构建器拥有(从某种意义上说,我手动实现了 Drop
的 Builder
并重构了 std::ffi::CString
以释放内存),但由于 FFI 的要求,它们必须以这种方式存储。
这个构建器类型不是 copy
也不是 Clone
,所以永远不会出现多个构建器认为他们拥有相同的字符指针的情况。这些指针也永远不会直接暴露在构建器的公共 API 中。
当然,由于指针是!Send
,Vec
的{{1}}也是!Send
,所以!Send
默认是Builder
。但是,在我看来,由于我的构建器在语义上维护指针的所有权,因此为 !Send
手动实现 Send
是安全的。我相信我所做的类似于手动实现 Builder
和 Box
is Send
if the thing inside the box is also Send
,只是在我的情况下,“盒子”内的东西在逻辑上是一个切片 (Box
,它是 [const std::os::raw::c_char]
) 而不是原始指针(Send
,即 *mut const std::os::raw::c_char
)。
情况确实如此(我对 !Send
的理解是否正确),在为 Send
实现 Send
时还有什么我应该担心的吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)