前言
今天小电视给我推送了一个视频,讲美国不知道什么部门(视频里这样说的),提倡底层软件去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,自己瞎说也没什么说服力。

作为金融级数据库,代码中依然存在大量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语言在栈区的数据一样会自动回收,但根据业务需要,存在动态分配资源的场景,那无节制的分配中,总会出现没有考虑到的情况,使用编程语言机制是不能杜绝这种情况的。
你只能通过更好的资源调配和熔断机制来防止内存爆炸的情况发生,而不可能依靠编程语言特性去阻止内存泄漏。当然你可以彻底检查代码,让没有熔断机制的代码都不能通过编译检查,但这样做无非是增加编译时间,而且熔断的不及时或容量设置不合理一样会发生内存爆炸,所以实际来讲不可能避免内存爆炸的发生,只能是尽可能的通过资源调配和熔断来阻止内存爆炸。
为什么上一段我用了内存爆炸,而不是内存泄漏,是因为概念名词,每个人心里都不一样。就像编译一样,本来编译在旧版教科书上单指把高级语言转换成汇编或二进制。那现在我看只要是某种计算机语言转换,大家都说的编译,我也就妥协了,名词这种东西,都是噱头,做实事的人要搞清楚背后的逻辑才行。
后言
这应该不算常识了,我觉得本文还是很有价值的。