Допустимо ли, хотя и не поддерживается, передавать Box::from_raw
необработанные указатели в только что выделенную память
Нет, это недопустимо.
В частности, освободит ли Rust эту память при уничтожении возникающего Box
?
Да, и это причина того, что она недействительна.
Распределители памяти предоставляют в паре процедуры выделения и освобождения.Когда вы выделяете часть памяти одним распределителем, , вы должны освободить его этим распределителем .
Если вы этого не сделаете, когда распределитель, выполняющий освобождение, пойдет на выполнение какой бы то ни было бухгалтерской работы, он не будет знать об этом куске памяти.Распределитель, который фактически выполнил выделение, никогда не пометит эту память как недоступную.
Эти проблемы также не решены.Я отправил исправления в GLib , чтобы исправить места, где произошли несоответствующие распределения / освобождения и вызвали реальные проблемы в дикой природе.
На уровне необработанных указателей владение в значительной степени является состоянием ума, как в C или C ++.Для собственного что-то здесь означает, что вы несете ответственность за его надлежащую очистку.
malloc
и free
являются парными методами распределения / освобождения.Вы можете создать свой собственный тип и реализовать для него Drop
:
use libc::{free, malloc};
use std::{ffi::c_void, mem};
struct MallocBox(*mut i32);
impl MallocBox {
fn new(v: i32) -> Self {
unsafe {
let p = malloc(mem::size_of::<i32>()) as *mut i32;
*p = v;
Self(p)
}
}
}
impl Drop for MallocBox {
fn drop(&mut self) {
unsafe { free(self.0 as *mut c_void) }
}
}
fn main() {
MallocBox::new(42);
}
Реальная реализация также реализует Deref
и, возможно, многие другие черты, так что этот тип эргономичен для использования.
Было бы неприятно создавать MallocBox
и JeMallocBox
и MyCustomAllocBox
, поэтому RFC 1398 предлагает общую черту для распределителей.Связанные работы продвигаются для преобразования Box<T>
в Box<T, A: Alloc + Default = Global>
.
как можно заставить Rust
Нет понятия "принуждение"Ржавчина, чтобы сделать что-нибудь, тем более, когда дело доходит до деталей низкого уровня, как это.Например, нет гарантии, что код C, который выделил указатель, не пытается освободить сам указатель.В мире FFI право собственности является соглашением о сотрудничестве.
См. Также: