为什么我所有的指针指向与锈to_c_str()一样的地方?(Why are all my point

2019-10-19 20:39发布

我有这样的防锈方法:

/* 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 SOS呼叫看到过什么:

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.

为什么地球上是兆字节,fbytes和dbytes值都一样吗? O_O

Answer 1:

你在做什么是不安全的,并且它绊倒你。

module.to_c_str()用于分配空间CString 。 调用with_mut_ref上,让不安全的指针( *T*mut T )到CString -但该*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);
                }
            })
        })
    })
}


文章来源: Why are all my pointers pointing to the same place with to_c_str() in rust?
标签: rust