因为这是我第一次学习系统编程,所以我很难绕过规则.现在,我对内存泄漏感到困惑.让我们考虑一个例子.比如说,Rust正在抛出Python将要捕获的指针(指向一个字符串).
在Rust中,(我只是发送指针CString)
use std::ffi::CString;
pub extern fn do_something() -> *const c_char {
CString::new(some_string).unwrap().as_ptr()
}
Run Code Online (Sandbox Code Playgroud)
在Python中,(我正在取消引用指针)
def call_rust():
lib = ctypes.cdll.LoadLibrary(rustLib)
lib.do_something.restype = ctypes.c_void_p
c_pointer = lib.do_something()
some_string = ctypes.c_char_p(c_pointer).value
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是释放内存.我认为它应该在Python中释放,但随后所有权弹出.因为,as_ptr似乎采用了不可变的引用.所以,我对是否应该释放Rust或Python中的内存(或两者兼而有之)感到困惑.如果它会是Rust,那么当控制流重新回到Python时,我应该如何释放它呢?
我试图从 rust 中的 C 函数中检索原始指针,并在另一个库中的另一个 C 函数中使用相同的原始指针作为参数。当我传递原始指针时,我最终在 C 端得到了一个 NULL 指针。
我试图制作我的问题的简化版本,但是当我这样做时,它会像我期望的那样工作 -
C 代码 -
struct MyStruct {
int value;
};
struct MyStruct * get_struct() {
struct MyStruct * priv_struct = (struct MyStruct*) malloc( sizeof(struct MyStruct));
priv_struct->value = 0;
return priv_struct;
}
void put_struct(struct MyStruct *priv_struct) {
printf("Value - %d\n", priv_struct->value);
}
Run Code Online (Sandbox Code Playgroud)
锈代码 -
#[repr(C)]
struct MyStruct {
value: c_int,
}
extern {
fn get_struct() -> *mut MyStruct;
}
extern {
fn put_struct(priv_struct: *mut MyStruct) -> ();
}
fn …Run Code Online (Sandbox Code Playgroud) 我有一个期望的C函数,*const std::os::raw::c_char并且在Rust中完成了以下操作:
use std::os::raw::c_char;
use std::ffi::{CString, CStr};
extern crate libc;
fn main() {
let _test_str: *const c_char = CString::new("Hello World").unwrap().as_ptr();
let fmt: *const c_char = CString::new("%s\n").unwrap().as_ptr();
unsafe { libc::printf(fmt, _test_str); }
unsafe {
let slice = CStr::from_ptr(_test_str);
println!("string buffer size without nul terminator: {}", slice.to_bytes().len());
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法_test_str打印出来,上面程序的输出很简单
string buffer size without nul terminator: 0
Run Code Online (Sandbox Code Playgroud)
如果我将传递给_test_str某些C函数,然后看到它是一个空字符串。我做错什么了?
谢谢!
我想以与PowerShell类似的方式在 Rust 中创建一个对话框或弹出窗口。
我正在努力寻找有关 Windows API 的文档。到目前为止我发现的最接近的是宏(CreateDialogA Rust winapi 等效)。
我在上面找到了一些东西,例如创建新对话框(C++),但其中大部分不适用于 Rust 项目。
也许对话模板是相关的?
rust ×4
ffi ×3
c ×1
ctypes ×1
memory-leaks ×1
python ×1
raw-pointer ×1
reference ×1
winapi ×1
windows ×1