为什么创建和写入一个非常大的向量会导致核心转储?

Why does creating and writing to a very large vector cause a core dump?

我正在创建埃拉托色尼筛法,这样我就可以看到直到起始数的所有素数。仅以下代码会导致 Rust 1.26 上的核心转储。没有编译器警告或错误,核心转储也不是很有用,也没有错误消息。

fn main() {
    let starting_number: i64 = 600851475143;
    let mut primes = vec![true; 600851475143];

    primes[0] = false;
    primes[1] = false;

    for i in 2..((starting_number as f64).ln() as usize) {
        if primes[i] {
            let mut j = i + i;
            while j < primes.len() {
                primes[j] = false;
                j += i;
            }
        }
    }
}

我以为 Rust 就是为了安全和避免核心转储?这是我的代码没有被编译器捕获的合法错误还是其他原因?

问题是你 运行 内存不足。

很多操作系统都是"lazy"分配内存。这意味着 OS 在您使用它之前不会实际分配您请求的实际内存量。您要求至少 75 106 434 393 octets (a.k.a. 70 Gio) but ,因此您要求 600 851 475 143 字节(a.k.a。600 GiB)——您的 OS 一定找不到足够的空间内存。

这是您的 OS 无法处理的错误,因为它已经在您请求内存时告诉您 "OK"。这是一个严重错误,因此它会以核心转储结束您的进程。

I thought Rust was all about safety and avoiding core dumps?

核心转储并不一定意味着您的程序不安全。如您所见,您的程序没有进行越界内存访问,它只是没有足够的内存。从您 OS 的角度来看,这是处理此错误的最佳方法,根据 Rust 中安全的定义,没有什么不安全的。


顺便说一句,在我的机器(archlinux)上,你的程序被简单地杀死了:

[1]    4901 killed     cargo run