运行此:
fn main() {
std::iter::count(1i16, 3).collect::<Vec<i16>>();
}
我明白了:
线程&#39;&#39;恐慌于容量溢出&#39;,/ home / thepang /projects / stud / src / libcore / options.rs:329
这是我在执行此操作时所期望的:
fn main() {
std::iter::count(1i8, 3).collect::<Vec<i8>>();
}
但相反,我明白了:
非法指导
此外,syslog显示以下行:
Dec 27 08:31:08 thome kernel:[170925.955841]陷阱:main [30631]陷阱无效操作码ip:7f60ab175470 sp:7fffbb116578错误:0 in main [7f60ab15c000 + 5b000]
答案 0 :(得分:3)
这是一次有趣的冒险。
Iter::collect
只需拨打FromIterator::from_iter
Vec
's implementation of FromIterator
询问迭代器的大小,然后分配内存:
let (lower, _) = iterator.size_hint();
let mut vector = Vec::with_capacity(lower);
Vec::with_capacity
计算内存的总大小并尝试分配它:
let size = capacity.checked_mul(mem::size_of::<T>())
.expect("capacity overflow");
let ptr = unsafe { allocate(size, mem::min_align_of::<T>()) };
if ptr.is_null() { ::alloc::oom() } // Important!
在这种情况下,i8
占用1个字节,无限迭代器的下限为std::uint::MAX
。乘以一起,仍然是std::uint::MAX
。当我们分配它时,我们得到一个空指针。
alloc::oom
被定义为简单中止,由非法指令实施!
i16
具有不同行为的原因是因为它触发了checked_mul
期望 - 您无法分配std::uint::MAX * 2
个字节!