相关疑难解决方法(0)

使用`as_ptr()`时如何停止内存泄漏?

因为这是我第一次学习系统编程,所以我很难绕过规则.现在,我对内存泄漏感到困惑.让我们考虑一个例子.比如说,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时,我应该如何释放它呢?

python ctypes memory-leaks ffi rust

8
推荐指数
1
解决办法
462
查看次数

从 Rust 到 C 的原始指针变为空

我试图从 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 ffi rust

4
推荐指数
1
解决办法
1246
查看次数

CString :: new()。unwrap()。as_ptr()给出空的* const c_char

我有一个期望的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函数,然后看到它是一个空字符串。我做错什么了?

谢谢!

reference ffi rust raw-pointer

1
推荐指数
1
解决办法
270
查看次数

使用 Windows API 在 Rust 中创建弹出窗口

我想以与PowerShell类似的方式在 Rust 中创建一个对话框或弹出窗口。

我正在努力寻找有关 Windows API 的文档。到目前为止我发现的最接近的是CreateDialogA Rust winapi 等效)。

我在上面找到了一些东西,例如创建新对话框(C++),但其中大部分不适用于 Rust 项目。

也许对话模板是相关的?

windows winapi rust

1
推荐指数
1
解决办法
2535
查看次数

标签 统计

rust ×4

ffi ×3

c ×1

ctypes ×1

memory-leaks ×1

python ×1

raw-pointer ×1

reference ×1

winapi ×1

windows ×1