Я хотел бы выделить структуру вручную и повторно использовать встроенные типы в этих структурах.Это моя первоначальная цель, см. Код ниже:
use libc::*;
use std::mem;
#[repr(C)]
#[derive(Debug)]
pub struct Person {
pub age: u32,
pub name: String,
}
fn main() {
let sz = mem::size_of::<Person>();
println!("{:#?}", sz);
unsafe {
let p = malloc(sz) as *mut Person;
(*p).name = "tom".to_string();
println!("{:#?}", *p);
// should I explicitly free the memory used by `name` before
// free the outer object pointer `p`? In other words, will rust
// automatically generate some code for freeing `name`?
free(p as *mut c_void);
}
}
Структура Person
будет выделена с помощью libc::malloc
, поскольку в ней есть поле, в котором используется встроенный тип String
, Iне знаю, как бороться с этим делом.Приведенный выше код может быть успешно скомпилирован, но случайным образом выдает исключение, например malloc: *** error for object 0x7000000000000000: pointer being freed was not allocated
. Могут ли встроенные типы, такие как String
, использоваться вместе с объектами, выделенными вручную?Если да, то как их правильно использовать?Если нет, то почему?