假设我有一个分配了缓冲区uint8_t*的C++,并且我想从Rust访问它: 一种方法是使用C++函数: uint8_t receive(uint8_t** data, size_t* size) {
//allocates the data, writes to it and then points *data to it
return 0;//on success
} 然而,这使得Rust负责解除数据的定位。相同的 uint8_t* receive(size_t* size) {
uit8_t* data = //allocates data
*size
我对Rust很陌生,并试图了解从函数返回对象时所有权是如何传递的。在下面的基于引用的实现中,由于引用没有所有权,所以当"s“超出范围时,它会被删除和释放。
fn dangle() -> &String { // dangle returns a reference to a String
let s = String::from("hello"); // s is a new String
&s // we return a reference to the String, s
} // Here, s goes out of
在以下情况下,我试图了解锈菌的混叠规则:
让我们假设C中有一个内存分配,我们将指向这个分配的指针传递给Rust。Rust函数对分配做一些事情,然后调用C代码(没有任何参数),在C代码中调用另一个铁锈函数,与参数的分配相同。现在,让我们假设只有第一个Rust函数才能得到一个可变的引用。
调用堆栈如下所示:
Some C Code (owns data)
Rust(pointer as &mut)
Some C code (does not get parameters from Rust)
Rust(pointer as &)
作为一个简短的例子,让我们假
我正试图通过遵循c++示例、微软为ADSI和Windows机箱发布的帖子来处理Rust中的活动目录。我不太明白这是怎么回事:
他们创建一个指向IADs的未初始化指针(根据我的c#知识,它看起来像一个接口),然后,当需要使用它时,它们有一个双指针,它被强制转换为无效。我试着在Rust中复制这种行为,但我想我只是不知道到底发生了什么。这就是我迄今为止尝试过的:
// bindings omitted
use windows::Interface;
use libc::c_void;
fn main() -> windows::Result<()> {
let