Допустим, у меня есть String
, "Foo Bar"
, и я хочу создать подстроку "Bar"
без выделения новой памяти.
Поэтому я переместил необработанный указатель исходной строки в начало подстроки (в этом случае сместив ее на 4) и использовал функцию String :: from_raw_parts () для создания строки.
Пока у меня есть следующий код, который, насколько я понимаю, должен делать это просто отлично. Я просто не понимаю, почему это не работает.
use std::mem;
fn main() {
let s = String::from("Foo Bar");
let ptr = s.as_ptr();
mem::forget(s);
unsafe {
// no error when using ptr.add(0)
let txt = String::from_raw_parts(ptr.add(4) as *mut _, 3, 3);
println!("{:?}", txt); // This even prints "Bar" but crashes afterwards
println!("prints because 'txt' is still in scope");
}
println!("won't print because 'txt' was dropped",)
}
Я получаю следующую ошибку в Windows:
error: process didn't exit successfully: `target\debug\main.exe` (exit code: 0xc0000374, STATUS_HEAP_CORRUPTION)
И это в Linux (грузовой рейс; грузовой рейс - выпуск):
munmap_chunk(): invalid pointer
free(): invalid pointer
Я думаю, что это как-то связано с деструктором String, потому что, пока в области действия находится txt
, программа работает нормально.
Еще одна вещь, на которую стоит обратить внимание: когда я использую ptr.add(0)
вместо ptr.add(4)
, он работает без ошибок.
Создание фрагмента не доставило мне проблем с другой стороны. Сбрасывание, которое работало просто отлично.
let t = slice::from_raw_parts(ptr.add(4), 3);
В конце я хочу разделить принадлежащую строку на несколько принадлежащих String
без выделения новой памяти.
Любая помощь приветствуется.