【软件Dev常识】Rust(无unsafe),所有编程语言都能写出内存泄漏

前言

今天小电视给我推送了一个视频,讲美国不知道什么部门(视频里这样说的),提倡底层软件去C/C++化,原因是因为C/C++内存不安全,那我只能说,不是营销号无脑,就是技术部门无脑。

Rust如何写出内存泄漏

以下代码均不含unsafe语句,看不懂可以不用看,直接看下一个标题解释为什么写这些代码

use std::thread;
use std::mem;
use std::time::Duration;
fn main() {
    let handle = thread::spawn(|| {
        loop {
            thread::sleep(Duration::from_secs(1));
        }
    });
    mem::forget(handle);
    loop {
        thread::spawn(|| {
            let v: Vec<i32> = vec![0; 1000000];
            loop {
                thread::sleep(Duration::from_secs(1));
            }
        });
        thread::sleep(Duration::from_millis(100));
    }
}
#[derive(Debug)]
struct MemoryLeak<T> {
    data: Vec<Vec<T>>,
}
impl<T: Clone> MemoryLeak<T> {
    fn new() -> Self {
        MemoryLeak {
            data: Vec::new()
        }
    }
    fn append(&mut self, value: T) {
        let mut new_vec = Vec::new();
        for existing_vec in &self.data {
            let mut cloned = existing_vec.clone();
            cloned.push(value.clone());
            new_vec.push(cloned);
        }
        let mut single_value = Vec::new();
        single_value.push(value);
        new_vec.push(single_value);
        self.data = new_vec;
    }
    fn len(&self) -> usize {
        self.data.len()
    }
}
fn main() {
    let mut leaky = MemoryLeak::new();
    loop {
        leaky.append(42);
        std::thread::sleep(std::time::Duration::from_millis(100));
    }
}

上下文均是小说内容,无实际参考价值;IA护防懂都得懂

为什么要写出上述代码,自找麻烦

我不可能真去给你找一个实际Case给你看,因为这种经验就算在大厂也要写复盘文档,更何况我觉得经验没什么价值,我只能告诉你我印象里什么场景下容易出现上述情况。

  • 链接泄漏
  • 资源管理池
  • 直接使用三方库,不当配置或三方库本身存在问题导致

或许还有很多,你可以去问AI,GC语言的例子我也不举了(上面的Rust代码例子翻译成任何语言效果都一样),或许你告诉我这不叫内存泄漏,是因为没有熔断机制,那我就想知道本质上讲,都是写或设计程序时的失误,为什么你想的就算,这种case就不算呢,就问内存有没有炸。

上下文均是小说内容,无实际参考价值;IA护防懂都得懂

Rust在那些场景会使用unsafe

问AI,AI可以告诉你一大堆,我这里搜索一下TIDB底层TIKV的源码给大家看,因为我没写过rust,自己瞎说也没什么说服力。

TIKV源码

作为金融级数据库,代码中依然存在大量unsafe,所以...

我对C/C++的看法

我实际上也不写C/C++ 上学的时候写算法题或玩单片机的时候写过,或者一些奇怪的场景(我也记不清了),还有学习虚幻引擎的时候,cgo的时候也写过一些

然而C/C++你也可以像Rust一样做编译前检查,github上有大量的项目和插件可以检查C/C++代码是否存在内存泄漏,更何况我们还有AI。当然C/C++编译速度本来就比较慢,这点没办法和Rust比(具体原理我还不太清楚,也没兴趣了解)。

但如果说拿内存安全吹嘘Rust或贬低C/C++,那就像拿Java的跨平台支持(在这个时代)来吹捧Java一样滑稽可笑

我对Rust的看法

几次想学Rust我都放弃了,毕竟我估计这辈子也没机会开发系统级或驱动级软件,但底层软件用Rust写我觉得没任何毛病,就像我觉得用C写没任何毛病一样,你喜欢就用,我觉得Rust相对C++是有一些优势的,但我会C/C++老版本的全部语法(如果我没忘的话),曾经也用过很多C的标准库(完全记不起来),但我也想学Rust印象里我觉得Rust的语法很奇怪就没学下去。

如果有一天,我必须要开发底层软件,那我或许会倾向Rust,但这不代表我觉得C/C++就不行了。

我对内存泄漏的看法

内存泄漏,无非是动态申请的资源没有销毁,C语言在栈区的数据一样会自动回收,但根据业务需要,存在动态分配资源的场景,那无节制的分配中,总会出现没有考虑到的情况,使用编程语言机制是不能杜绝这种情况的。

你只能通过更好的资源调配熔断机制来防止内存爆炸的情况发生,而不可能依靠编程语言特性去阻止内存泄漏。当然你可以彻底检查代码,让没有熔断机制的代码都不能通过编译检查,但这样做无非是增加编译时间,而且熔断的不及时或容量设置不合理一样会发生内存爆炸,所以实际来讲不可能避免内存爆炸的发生,只能是尽可能的通过资源调配和熔断来阻止内存爆炸

为什么上一段我用了内存爆炸,而不是内存泄漏,是因为概念名词,每个人心里都不一样。就像编译一样,本来编译在旧版教科书上单指把高级语言转换成汇编或二进制。那现在我看只要是某种计算机语言转换,大家都说的编译,我也就妥协了,名词这种东西,都是噱头,做实事的人要搞清楚背后的逻辑才行。

后言

这应该不算常识了,我觉得本文还是很有价值的。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容