gpt4 book ai didi

rust - 为什么我所有的指针都指向同一个地方,并且 to_c_str() 使用rust 了?

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

我有这个 rust 方法:

/* Define a python method on a given module */
pub fn method(data: *mut Struct_ppyData, module: ~str, method: ~str, callback: PyCFunction, flags: Method, help: ~str) {
let mbytes = module.to_c_str().with_mut_ref(|a: * mut c_char| { a });
let fbytes = method.to_c_str().with_mut_ref(|b: * mut c_char| { b });
let dbytes = help.to_c_str().with_mut_ref(|c: * mut c_char| { c });
println!("Incoming! {} {} {}\n", module, method, help);
println!("Invoking! {} {} {}\n", mbytes, fbytes, dbytes);
let cflags = flags as c_int;
unsafe {
ppy_method(data, mbytes, fbytes, callback, cflags, dbytes);
}
}

我得到的输出是:

Incoming! yyy xxx A callback.
Invoking! 0x7f85084077d0 0x7f85084077d0 0x7f85084077d0

什么?这也是 ffi c 调用看到的内容:

Received a value
Pointer: 7f85084077d0
length: 11
--------> value: A callback.
Received a value
Pointer: 7f85084077d0
length: 11
--------> value: A callback.
Received a value
Pointer: 7f85084077d0
length: 11
--------> value: A callback.

为什么mbytes、fbytes和dbytes的值都是一样的? O_o

最佳答案

你正在做的事情是不安全的,它会让你绊倒。

module.to_c_str()CString 分配空间。调用 with_mut_ref 会给出一个指向该 CString 的不安全指针(*T*mut T)——但是*mut c_char 只对你传入的闭包有效。你已经让它在关闭结束后保持事件状态,所以所有的赌注都没有了;实际上,CString 在该表达式之后立即被释放,因为它没有存储在任何地方。因此,您有一个悬空的不安全指针(*T 被称为不安全是有原因的!)。然后,下一行进行类似的分配,瞧!它在同一个地方。最终结果:三个相同的指针,都指向相同的垃圾数据。

如果您确实需要这样一个不安全的指针,您应该做的是嵌套这些东西。

此外,正如 dbaupp 所观察到的,您不需要取得字符串的所有权;你也可以使用 &str 而不是 ~str

/// Define a python method on a given module
pub fn method(data: *mut Struct_ppyData, module: &str, method: &str,
callback: PyCFunction, flags: Method, help: &str) {
module.to_c_str().with_mut_ref(|mbytes| {
method.to_c_str().with_mut_ref(|fbytes| {
help.to_c_str().with_mut_ref(|dbytes| {
println!("Incoming! {} {} {}\n", module, method, help);
println!("Invoking! {} {} {}\n", mbytes, fbytes, dbytes);
let cflags = flags as c_int;
unsafe {
ppy_method(data, mbytes, fbytes, callback, cflags, dbytes);
}
})
})
})
}

关于rust - 为什么我所有的指针都指向同一个地方,并且 to_c_str() 使用rust 了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23053398/

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