所以假设我有一个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 上(cargo run;cargo run --release):
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
最后,我想在不分配新内存的情况下将拥有的 String 拆分为多个拥有的 s。
任何帮助表示赞赏。