2016-01-12 2 views
2

Из документов Rust.Кто ответственен за освобождение памяти после использования коробки

Функция in_raw потребляет поле и возвращает необработанный указатель. Он не уничтожает T или не освобождает память.

в этом коде:

fn main() { 
    let b = Box::new("hello".to_owned()); 
    let a: *mut String = Box::into_raw(b); 
} 

Я не использовал unsafe блок и как результат, мы не должны иметь никаких утечек памяти. Итак, если объект Box не несет ответственности за освобождение памяти после ее потребления, но память не освобождена и недоступна для дальнейшего использования, а исходные указатели не принадлежат ресурсам, кто освободит память?

+5

Вы можете протекать без использования 'unsafe'. Утечки памяти не нарушают безопасность памяти. – fjh

+0

@fjh, спасибо за напоминание, я забыл об этом –

ответ

4

Отказ от ответственности: указана @fjh в комментариях, но стоит упомянуть.

Безопасность памяти в целом не определена, поэтому для ржавчины установлено определенное определение. Суть его в том, что безопасность памяти для Rust означает: только доступ к выделенной и инициализированной памяти.

Следствием этого определения является то, что утечки памяти безопасны, потому что они не могут привести к оборванным указателям. Также считается безопасным не запускать деструкторы, поскольку они не могут нарушать безопасность памяти (хотя это может привести к утечке других ресурсов).

  • std::mem::forget был стабилизирован по this RFC
  • всегда было возможно течь, используя циклы std::rc::Rc или std::sync::Arc
  • ...

Box::into_raw в основном для взаимодействия с FFI, чтобы иметь возможность передавать право собственности на языковые границы, как указано в его документации надлежащим образом для освобождения памяти необходимо использовать Box::from_raw для воссоздания Box.

6

https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#method.into_raw указывает: «После вызова этой функции вызывающий абонент отвечает за память, ранее управляемую ящиком, в частности, вызывающий должен правильно уничтожить T и освободить память. Правильный способ сделать это - преобразовать указатель обратно в поле с Box :: from_raw, потому что Box не указывает, как распределяется память. "

Итак, если вы позволите своему необработанному указателю выйти из scobe без преобразования его обратно в коробку, у вас будет утечка памяти.

Смежные вопросы