gpt4 book ai didi

c++ - 使用后将通用对象传递给Rust并传递回C++进行销毁

转载 作者:行者123 更新时间:2023-12-03 11:41:14 25 4
gpt4 key购买 nike

我想将缓冲区从C++发送到Rust,在Rust中读取它们,并在不再需要它们时在C++上销毁它们。
这是我要接收的功能:

#[no_mangle]
pub extern "C" fn smol_stack_smol_socket_send(
smol_stack: &mut SmolStackType,
socket_handle_key: usize,
data: *mut u8,
len: usize,
endpoint: CIpEndpoint,
) -> u8 {
我想接收一个指向 uint8_t数据的指针,但我也不认为我需要自己使用 new uint8_t[size]分配此数据。例如,我可以用一个字符串来做:
std::string* s = new std::string("hello");
然后只需将 s.c_str()作为 uint8_t*传递给Rust。我不能简单地调用 delete[] s.c_str(),我需要在C++端删除 s字符串。因此,我正在考虑在我的函数 smol_stack_smol_socket_send中添加另外两个参数。一个是指向拥有 uint8_t缓冲区(在这种情况下为字符串,但可以是另一个)的对象的指针,另一个是指向接收此对象并进行销毁的函数的指针。
我想到了像在Rust中将字符串/对象作为void指针接收一样的方法,但是我不知道是否可能。另外,第二个参数,即要销毁的函数,也必须是一个对通用数据起作用的函数,因为我可以传递与拥有数据的字符串不同的对象。
在这里,什么是优雅而安全的解决方案?

最佳答案

如我所见,您至少有两个可能的路径。哪种方法对您有效将在很大程度上取决于这些调用如何组合在一起。
最简单的方法是仅考虑从C++传递给rust的数据,以保留其所有权。即smol_stack_smol_socket_send预计不会破坏传递给它的缓冲区。这项工作属于smol_stack_smol_socket_send的调用者。
rust 代码可能看起来像:

#[no_mangle]
pub extern "C" fn simpler_function(
data: *mut u8,
len: usize,
) { .. }
然后,C++代码将如下所示:
void with_string() {
std::string buffer("Hello World");
simpler_function(buffer.c_str(), buffer.length());
// C++ destroys the string here.
}

void with_newed_buffer() {
char* buffer=new char[10];
buffer[0]='A';
buffer[1]=0;
simpler_function(buffer, 2);
delete [] buffer;
}
另一种方法是将回调传递给函数以处理破坏缓冲区
type Destructor = extern "C" fn(*mut c_void);

#[no_mangle]
pub extern "C" fn core_function(
data: *mut u8,
len: usize,
calback_data: *mut c_void
destructor: Destructor
) {
..
// We're done with the data - destroy it
destructor(callback_data);
}
现在在C++中,代码可以如下所示:
void delete_buffer(void* buffer) {
delete [] (char*)buffer;
}

void with_newed_buffer() {
char* buffer=new char[10];
buffer[0]='A';
buffer[1]=0;
simpler_function(buffer, 2, buffer, delete_buffer);
}
IMO,您应该始终偏爱第一种方法。唯一不起作用的情况是当rust需要取得C++对象的所有权(并因此控制其生存期)时。通常,这意味着将其存储在 rust 收集等中的某个位置。

关于c++ - 使用后将通用对象传递给Rust并传递回C++进行销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62545275/

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