Как мне освободить C# Byte [], выделенный в ржавчине?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как мне освободить C# Byte [], выделенный в ржавчине?

Сообщение Anonymous »

У меня есть функция ржавчины, которая передает массив байтов в C#: < /p>

Код: Выделить всё

#[no_mangle]
pub extern "C" fn get_bytes(len: &mut i32, bytes: *mut *mut u8) {
let mut buf : Vec = get_data();
buf.shrink_to_fit();

// Set the output values
*len = buf.len() as i32;
unsafe {
*bytes = buf.as_mut_ptr();
}

std::mem::forget(buf);
}
< /code>
Из C#я могу позвонить ему без сбоя. (Вместо аварии я предполагаю, что  это правильно, но не уверен на 100%):
[DllImport("my_lib")] static extern void get_bytes(ref int len,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ref byte[] bytes);

void test()
{
int len = 0;
byte[] bytes = null;
get_bytes(ref len, ref bytes);
}
Я затем использую байты , но я понимаю, что эта память должна быть освобождена от ржавчины. Итак, у меня есть еще одна функция ржавчины, чтобы освободить его: < /p>

Код: Выделить всё

#[no_mangle]
pub extern "C" fn free_bytes(len: i32, bytes: *mut *mut u8) {
// also tried with: -------------- bytes: *mut u8
assert!(len > 0);

// Rebuild the vec
let v = unsafe { Vec::from_raw_parts(bytes, len as usize, len as usize) };

//println!("bytes to free: {:?}", v);

drop(v); // or it could be implicitly dropped
}
< /code>
и соответствующий C#. Создание вызова сбоя моего приложения: < /p>
[DllImport("my_lib")] extern void free_bytes(int len, ref byte[] bytes);

void test()
{
int len = 0;
byte[] bytes = null;
get_bytes(ref len, ref bytes);

// copy bytes to managed memory
bytes[] copy = new byte[len];
bytes.CopyTo(copy, 0);
// free the unmanaged memory
free_bytes(len, ref bytes); // crash occurs when executing this function
}
Я вижу, что vec :: from_parts_raw "очень небезопасно". Потому что "

Код: Выделить всё

capacity
необходимо быть той способностью, с которой был выделен указатель. «Я также попытался пропустить емкость между rust & c# без shrink_to_fit для сохранения длины и емкости. Это также разбито. (через байты, чтобы бесплатно «println».>

Подробнее здесь: https://stackoverflow.com/questions/667 ... ed-in-rust
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»