Rust 学习笔记:循环引用可能导致内存泄漏

Rust 语言特性:循环引用与弱指针 Weak<T> 本文探讨了Rust中智能指针的循环依赖问题及其解决方案。文章首先通过一个示例展示了Rc<T>和RefCell<T>组合使用时的循环引用场景,其中两个数据结构相互持有对方的共享指针导致内存无法释放。随后分析了强引用计数的变化过程以及由此引发的内存泄漏问题。最后提出使用Weak<T>弱指针替代Rc<T>来打破循环依赖,通过Rc::downgrade()方法将共享指针降级为弱指针,从而避免循环引用导致的资源泄漏问题。文章还推荐了相关技术文章供读者进一步学习Rust的借用检查、生命周期等核心概念。 阅读详情

Rust 学习笔记:循环引用可能导致内存泄漏

使用 Rc<T> 和 RefCell<T> 可能造成项在一个循环中相互引用。因为循环中每个项的引用计数永远不会达到 0,并且这些值永远不会被丢弃,导致内存泄漏。

创建一个循环引用

让我们从 List 枚举和 tail 方法的定义开始,看看引用循环是如何发生的,以及如何防止它。

use crate::List::{Cons, Nil};
use std::cell::RefCell;
use std::rc::Rc;

#[derive(Debug)]
enum List {
    Cons(i32, RefCell<Rc<List>>),
    Nil,
}

impl List {
    fn tail(&self) -> Option<&RefCell<Rc<List>>> {
        match self {
            Cons(_, item) => Some(item),
            Nil => None,
        }
    }
}

fn main() {}

重新定义了 List,Cons 变量中的第二个元素现在是 RefCell<Rc<List>>,这意味着我们不能修改 i32 值,而是要修改 Cons 变量所指向的 List 值。我们还添加了一个 tail 方法,以便在有 Cons 变量时方便地访问第二个项。

接着实现 main 函数,在 a 中创建了一个链表,初始列表为 5、Nil。在 b 中创建了一个指向 a 中的链表的链表。然后修改 a 中的链表,使其指向 b,从而创建了一个引用循环。在此过程中有 println! 语句显示该过程中各个点的引用计数。

fn main() {
    let a = Rc::new(Cons(5, RefCell::new(Rc::new(Nil))));

    println!("a initial rc count = {}", Rc::strong_count(&a));
    println!("a next item = {:?}", a.tail());

    let b = Rc::new(Cons(10, RefCell::new(Rc::clone(&a))));

    println!("a rc count after b creation = {}", Rc::strong_count(&a));
    println!("b initial rc count = {}", Rc::strong_count(&b));
    println!("b next item = {:?}", b.tail());

    if let Some(link) = a.tail() {
        *link.borrow_mut() = Rc::clone(&b);
    }

    println!("b rc count after changing a = {}", Rc::strong_count(&b));
    println!("a rc count after changing a = {}", Rc::strong_count(&a));

    // Uncomment the next line to see that we have a cycle;
    // it will overflow the stack.
    // println!("a next item = {:?}", a.tail());
}

我们通过使用 tail 方法来获取 a 中的 RefCell<Rc<List>> 的引用,我们将其放入变量 link 中。然后,我们在 RefCell<Rc<List>> 上使用 borrow_mut 方法将内部的值从 Rc<List>(保存 Nil)更改为 b 中的 Rc<List>。

程序输出:

在这里插入图片描述

程序创建了一个循环引用:

在这里插入图片描述

在我们将 a 中的 List 改为指向 b 后,a 和 b 中的 Rc<List> 实例的引用计数都是 2。在 main 函数的末尾,Rust 删除变量 b,这将使 b Rc<List> 实例的引用计数从 2 减少到 1,同理也将 a Rc<List> 实例的引用计数减少到 1。这两个 Rc<List> 在堆上的内存此时不会被丢弃,分配给列表的内存将永远保持未回收状态。

如果取消注释最后一个 println! 然后运行程序,Rust 将尝试打印这个循环,a 指向 b, b 指向 a,以此类推,直到它溢出堆栈。

在这里插入图片描述

循环引用是程序中的逻辑错误,不能被 Rust 发现并纠正。应该使用自动化测试、代码审查和其他软件开发实践来最小化该错误。

避免引用循环的一个解决方案是重新组织数据结构,以便一些引用表示所有权,而另一些引用不表示所有权。

使用 Weak<T> 防止引用循环

到目前为止,我们已经演示了调用 Rc::clone 创建强引用,这会增加 Rc<T> 实例的 strong_count,而 Rc<T> 实例只有在其 strong_coun t为 0 时才会被清理。

可以通过调用 Rc::downgrade 并将引用传递给 Rc<T>,从而在 Rc<T> 实例中创建对该值的弱引用。弱引用不表达所有权关系,当 Rc<T> 实例被清理时,它们的计数不受影响。

弱引用不会导致引用循环,因为一旦所涉及的值的强引用计数为 0,任何涉及弱引用的循环都会被打破。

当调用 Rc::downgrade 方法时,你将获得一个 Weak<T> 类型的智能指针。g该方法不是将 Rc<T> 实例中的 strong_count 增加 1,而是将 weak_count 增加1 。Rc<T> 类型使用 weak_count 来跟踪存在多少个 Weak<T> 引用,类似于 strong_count。不同之处在于,要清除 Rc<T> 实例,weak_count 不必为 0。

因为 Weak<T> 引用的值可能已经被删除了,所以要对 Weak<T> 指向的值做任何操作,必须确保该值仍然存在。通过在一个 Weak<T> 实例上调用 upgrade 方法来实现这一点,该方法将返回一个 Option<Rc<T>>。如果 Rc<T> 值尚未被删除,将得到结果 Some,如果 Rc<T> 值已被删除,将得到结果 None。因为 upgrade 返回 Option<Rc<T>>, Rust 将确保 Some 和 None 情况得到处理,并且不会有无效指针。

我们以树形数据结构为例进行讲解。

创建树形数据结构:带子节点的节点

首先,我们将构建一个树,其中的节点知道它们的子节点。

创建一个名为 Node 的结构体,它保存自己的 i32 值以及对其子节点值的引用:

use std::cell::RefCell;
use std::rc::Rc;

#[derive(Debug)]
struct Node {
    value: i32,
    children: RefCell<Vec<Rc<Node>>>,
}

我们希望一个节点拥有它的子节点,并且我们希望与变量共享这个所有权,这样我们就可以直接访问树中的每个节点。为此,我们将 Vec<T> 项定义为 Rc<Node> 类型的值。我们还想修改子节点,所以我们在 Vec<Rc<Node>> 外套上了一层 RefCell<T>。

接下来,我们创建一个名为 leaf 的 Node 实例,它的值为 3,没有子节点。再创建一个名为 branch 的实例,它的值为 5,leaf 是它的子节点之一。

fn main() {
    let leaf = Rc::new(Node {
        value: 3,
        children: RefCell::new(vec![]),
    });

    let branch = Rc::new(Node {
        value: 5,
        children: RefCell::new(vec![Rc::clone(&leaf)]),
    });
}

我们使用 Rc::clone 将 leaf 存储在 branch.children 中,这意味着 leaf 中的 Node 现在有两个所有者:leaf 和 branch。

我们可以通过 branch.children 从 branch 到 leaf,但是没有办法从 leaf 到 branch。

我们想让 leaf 知道 branch 是它的父结点,在下一小节实现。

添加一个从子节点向父节点的引用

为了让子节点知道它的父节点,我们需要在 Node 结构体的定义中添加一个 parent 字段。

显然 Rc<T> 是不行的,leaf.parent 指向 branch,branch.children 指向 leaf,这将使得 leaf 和 branch 的 strong_count 值永远不会为 0,导致循环引用。

从另一个角度考虑关系,父节点应该拥有它的子节点:如果父节点被删除,它的子节点也应该被删除。但是,子节点不应该拥有它的父节点:如果我们删除一个子节点,父节点应该仍然存在。!

这是一个弱引用的例子!因此,我们将使 parent 字段的类型定义为 RefCell<Weak<Node>>,现在我们的 Node 结构体定义为:

use std::cell::RefCell;
use std::rc::{Rc, Weak};

#[derive(Debug)]
struct Node {
    value: i32,
    parent: RefCell<Weak<Node>>,
    children: RefCell<Vec<Rc<Node>>>,
}

一个节点可以引用它的父节点,但不拥有它的父节点。更新 main 函数,这样叶子节点就有了一种方法来引用它的父节点分支。

fn main() {
    let leaf = Rc::new(Node {
        value: 3,
        parent: RefCell::new(Weak::new()),
        children: RefCell::new(vec![]),
    });

    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());

    let branch = Rc::new(Node {
        value: 5,
        parent: RefCell::new(Weak::new()),
        children: RefCell::new(vec![Rc::clone(&leaf)]),
    });

    *leaf.parent.borrow_mut() = Rc::downgrade(&branch);

    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
}

起初,当我们试图通过使用 upgrade 方法获取对 leaf 父节点的引用时,我们得到一个 None 值:

leaf parent = None

之后,程序修改 leaf,为它提供一个对其父节点的 Weak<Nod\e> 引用。我们在 leaf 的 parent 字段中的 RefCell<Weak<Node>> 上使用 borrow_mut 方法,得到 Weak<Node> 的可变引用,然后我们使用 Rc::downgrade 从 branch 中的 Rc<Node> 创建一个到 branch 的 Weak<Node> 引用。

当我们再次打印 leaf 的父节点的引用时,这次我们将得到一个包含 branch 的 Some 变量。Weak<Node> 引用被打印为 (Weak)。

leaf parent = Some(Node { value: 5, parent: RefCell { value: (Weak) }, children: RefCell { value: [Node { value: 3, parent: RefCell { value: (Weak) }, children: RefCell { value: [] } }] } })

观察 strong_count 和 weak_count 的变化

让我们看看 Rc<Node> 实例的 strong_count 和 weak_count 值是如何通过创建一个新的内部作用域并将 branch 的创建移动到该作用域中来改变的。

修改之前的代码:

fn main() {
    let leaf = Rc::new(Node {
        value: 3,
        parent: RefCell::new(Weak::new()),
        children: RefCell::new(vec![]),
    });

    println!(
        "leaf strong = {}, weak = {}",
        Rc::strong_count(&leaf),
        Rc::weak_count(&leaf),
    );

    {
        let branch = Rc::new(Node {
            value: 5,
            parent: RefCell::new(Weak::new()),
            children: RefCell::new(vec![Rc::clone(&leaf)]),
        });

        *leaf.parent.borrow_mut() = Rc::downgrade(&branch);

        println!(
            "branch strong = {}, weak = {}",
            Rc::strong_count(&branch),
            Rc::weak_count(&branch),
        );

        println!(
            "leaf strong = {}, weak = {}",
            Rc::strong_count(&leaf),
            Rc::weak_count(&leaf),
        );
    }

    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
    println!(
        "leaf strong = {}, weak = {}",
        Rc::strong_count(&leaf),
        Rc::weak_count(&leaf),
    );
}

程序输出:

在这里插入图片描述

在创建 leaf 之后,它的 Rc<Node> 的强引用计数为 1,弱引用计数为 0。

在内部作用域中,我们创建 branch 并将其与 leaf 关联,此时当我们打印计数时,branch 中的 Rc<Node> 将具有强引用计数 1 和弱引用计数 1。

当我们在 leaf 中打印计数时,我们会看到它将有一个强引用计数 2,因为现在有一个 leaf 的 Rc<Node> 的克隆存储在 branch.children 中,但弱引用计数仍为 0。

当内部作用域结束时,branch 退出作用域,它的 Rc<Node> 的强引用计数减少到 0,因此它的 Node 被销毁,即使其弱引用计数为 1。

如果我们试图在作用域结束后访问 leaf 的父节点,我们将得到 None。在程序结束时,leaf 中的 Rc<Node> 的强计引用数为 1,弱引用计数为 0,因为变量 leaf 现在是对 Rc<Node> 的唯一引用。

所有管理引用计数和值删除的逻辑都内置在 Rc<T> 和 Weak<T> 以及它们的 Drop trait 实现中。

手把手教你从入门到精通C# 操作MySql数据库 本文是《C#操作MySql数据库从入门到精通》专栏的导读,帮助大家知道学习本专栏能够获取什么! 阅读详情

相关推荐

手把手教你解决Windows 10网络驱动器无法访问问题(附详细排查步骤)

本文详细指导Windows 10用户解决网络驱动器无法访问的常见问题。通过从现象快速定位到系统排查,提供了从检查网络连通性、修复凭据权限到调整高级设置的完整步骤,特别是针对“找不到网络路径”等错误,帮助用户高效恢复对共享资源的访问。

weixin_29233857的博客 517

【Rust 基础篇】Rust 引用循环:解析和避免

引用循环在 Rust 中是一种常见的编程错误,它会导致资源无法被正确释放,从而造成内存泄漏和其他潜在的问题。引用循环通常发生在存在相互引用的情况下,即 A 对象引用了 B 对象,同时 B 对象也引用了 A 对象,形成一个闭环。data : 2 , next : Some(Box :: new(node1)) , // node2 引用了 node1 };// node1 引用了 node2 let node1_next = node2 . next . unwrap();

繁依Fanyi的博客 1466

Nangate 45nm FreePDK开源工艺库:从RTL到GDSII全流程实战

在数字IC设计中,标准单元库是连接逻辑综合与物理实现的基石,它定义了每个单元的逻辑功能、时序延迟与物理尺寸。开源EDA工具链的成熟,使得个人也能借助免费工艺套件完整跑通芯片设计流程。Nangate 45nm FreePDK作为一套经典的开源工艺库,凭借结构清晰、配套完善的特性,成为学习数字后端和时序收敛的理想训练场。从综合工具Yosys读取Liberty文件进行逻辑映射,到OpenROAD执行布局布线与时钟树综合,再到使用OpenSTA分析关键路径延迟,这套流程涵盖了数字设计最核心的环节。通过亲手操作,开发

weixin_29168393的博客 271

rust循环引用问题

循环引用的时候需要使用weak,弱引用,一般把上级作为弱引用加到下级里 trait Sprite { fn draw(&self); fn update(&self); } struct Ball { game: RefCell<Weak<Game>>, } impl Sprite for Ball { fn draw(&...

独自登高楼 望断天涯路 2190

别再踩坑了!CAPL脚本里局部变量和全局变量的那些“怪事”(附CANoe实测代码)

本文深度解析CAPL脚本中局部变量和全局变量的特殊机制,揭示其与通用编程语言的差异。通过实测代码展示静态局部变量的默认行为和全局变量的节点隔离特性,并提供高效避坑指南,帮助汽车网络测试工程师避免常见陷阱。

weixin_30225755的博客 293

2026 具身智能 VLA/WAM 全栈学习与训练路线:从动作建模、SFT、RL 到世界模型的 RTX PRO 6000 96GB 单卡实战指南

我会把这张表做成“”而不是只列论文名:先核对每个模型截至的公开代码、训练目标和数据接口,再单独给你一套。对于没有公开、只有推理代码或训练细节不完整的模型,我会明确标出来,避免把“论文里提到”误写成“可复现”。目前有一个重要更新:。截至今天 NVIDIA 官方开源主线已经是换成 Cosmos-Reason2-2B/Qwen3-VL 架构,动作端仍是连续路线,而且官方明确给出单卡微调时默认只训练,峰值显存约。所以你的 96GB 单卡对 GR00T SFT 非常宽裕。可以。下面我按,把它整理成一张真正面向“

u013250861的博客 444

学习笔记 20240807 Rust语言-Weak 与循环引用

基于Rust语言圣经的学习笔记之Weak 与循环引用

qq_51181223的博客 1020

【制作100个unity实战之2】实现一款简单的FPS游戏

你将学到: fps武器脚本 基础瞄准功能 僵尸敌人AI 巡逻范围 攻击间 搜寻半径 追击 枪声吸引周围的僵尸 击中僵直效果

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3550

Rust 中的引用循环与内存泄漏

Rust 以其内存安全性著称,但内存安全并不意味着永远不会发生内存泄漏。尽管 Rust 的所有权系统可以避免大多数常见的内存问题,但在某些情况下(特别是使用了 `Rc<T>` 与 `RefCell<T>` 的场景中)依然可能不经意地创建出**引用循环**,进而导致内存泄漏。

hello.reader 1178

ResNet改进(7):添加 SK注意力机制

实现 SK 注意力机制。

2401_82355416的博客 731

多模态论文笔记——BLIP

本文详细介绍这几年AIGC火爆的隐藏功臣,多模态模型:BLIP。

haopinglianlian的博客 2454

Rust 循环借用

原文 https://exyr.org/2018/rust-arenas-vs-dropck/ 内容 所有权与借用是rust数据结构的的基础。然而,只有在创造变量之后才能取得其所有权(移动它)或引用它。 这种方式似乎可以防止在数据结构中出现循环(引用),即使(循环引用)有时很有必要。 例如,在网页内容树中,从任何DOM节点,都可以轻松访问(如果有的话)其第一个和最后一个子节点,前一个和下...

归去来兮的博客 1988

14、多标签分类与卷积神经网络在医学图像处理中的应用

本文探讨了多标签分类与卷积神经网络(CNN)在医学图像处理中的应用。文章详细介绍了多标签分类的概念和挑战,以及如何通过CNN进行高效、准确的分类任务。内容涵盖模型设计、损失函数选择、数据增强技术、类别权重调整等关键技术点,并结合实际案例,如白内障手术工具检测、视网膜血管分割等,展示了CNN在医学图像分析中的强大潜力。此外,还讨论了模型优化策略及面临的挑战与解决方案。

t8u9v0的博客 191

【Rust】——引用循环与内存泄漏

目录 🎯制造引用循环 🎃创建树形数据结构:带有子节点的Node 🎃增加子到父的作用 🎃可视化strong_count和week_count的改变

shsjssnn的博客 2521

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Rust自学】15.7. 循环引用导致内存泄漏

Rust极高的安全性使得内存泄漏**很难出现**,但**并不是完全不可能**。例如使用`Rc<T>`和`RefCell<T>`就可能创造出循环引用,造成内存泄漏:每个指针的引用计数都不会减少到0,值也不会被清理。

A Rookie in San Domenico School 1730

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Rust 循环引用与内存泄漏指南:如何避免‘死亡拥抱

建议开发者在设计数据结构时优先考虑潜在的循环引用风险,并在设计之初引入弱引用。

hello.reader 1919

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【Rust 基础篇】Rust 弱引用:解决引用循环与内存泄漏

本篇博客详细介绍了 Rust 弱引用的概念、用法,以及如何通过弱引用解决引用循环和内存泄漏问题。引用循环是一种常见的编程错误,容易导致内存泄漏和资源泄漏,因此在编写 Rust 代码时需要特别注意。希望本篇博客对你理解和使用 Rust 弱引用有所帮助。

繁依Fanyi的博客 1638

Rust中的循环引用和弱引用

循环引用(Cyclic Reference)是指在一个数据结构中,元素之间相互引用,形成一个环。例如,A 引用 B,B 引用 C,C 又引用 A,这样就构成了一个循环引用。在普通的引用计数管理(如Arc或Rc)下,循环引用会导致内存泄漏问题。因为所有对象都有一个强引用计数,如果两个对象相互持有强引用,它们的引用计数永远不会降到 0,导致内存不能被释放。

weixin_46063534的博客 619

Rust从入门到实战系列一百八十一:引用循环与内存泄漏

Rust 的内存安全性保证使其难以意外地制造永远也不会被清理的内存(被称为 内存泄漏(memoryleak)),但并不是不可能。与在编译时拒绝数据竞争不同,Rust 并不保证完全地避免内存泄漏,这意味着内存泄漏在 Rust 被认为是内存安全的。这一点可以通过 Rc 和 RefCell 看出:创建引用循环的可能性是存在的。这会造成内存泄漏,因为每一项的引用计数永远也到不了 0,其值也永远不会被丢弃。制造引用循环让我们看看引用循环是如何发生的以及如何避免它。

wanmeijuhao的博客 749

结构体引用_Rust语言入门教程 引用循环与内存泄漏

Rust 的内存安全性保证使其难以意外地制造永远也不会被清理的内存(被称为 内存泄漏(memory leak)),但并不是不可能。与在编译时拒绝数据竞争不同, Rust 并不保证完全地避免内存泄漏,这意味着内存泄漏在 Rust 被认为是内存安全的。这一点可以通过 Rc 和 RefCell 看出:创建引用循环的可能性是存在的。这会造成内存泄漏,因为每一项的引用计数永远也到不了 0,其值也永远不会被丢...

weixin_36149595的博客 464

Rust 内存泄漏检测与防范

与内存安全漏洞不同,Rust 认为内存泄漏是"安全"的,因为它不会导致未定义行为,但在长期运行的服务中,内存泄漏会逐渐耗尽系统资源,最终导致程序崩溃。Rust 的内存安全保证建立在所有权和生命周期的基础上,但这些机制主要防止的是悬垂指针和数据竞争,而非内存泄漏。Miri 对于检测 unsafe 代码块中的内存问题特别有效,但它无法检测所有类型的内存泄漏,特别是那些涉及复杂引用关系的场景。通过 Heaptrack 的火焰图,可以直观地看到哪些代码路径导致了内存持续增长,这对于识别隐藏的引用循环特别有效。

2501_94033138的博客 1624

Go/Rust并发避坑指南——死锁、数据竞争与内存泄漏的典型案例

Go和Rust都以并发安全作为核心卖点:Go的goroutine轻量且通信简单,Rust的类型系统在编译期就保证内存安全。但这两种语言的并发原语都存在容易踩到的陷阱——Go的channel和mutex组合不当会死锁,Rust的unsafe块和RefCell会绕过编译期检查引入数据竞争,而两者的并发场景都容易出现隐蔽的内存泄漏。生产环境中并发故障的共性特征是:本地测试很难复现,压力测试偶发,线上在特定流量模式下才暴露。

iymei4986533030的博客 6833

Rust 内存泄漏的隐蔽角落:循环引用、ManuallyDrop 与线程悬挂

在 Rust 的设计哲学中,内存泄漏是完全被类型系统所允许的(Safe Rust 允许Box::leak在真实的生产级中大型 Rust 系统中,内存泄漏往往不会以野指针崩溃的方式暴露,而是悄无声息地吞噬服务器的物理 RAM,直到触发 Linux OOM Killer 导致整个服务被操作系统瞬间杀死。深入排查 Rust 中三大隐蔽的内存泄漏陷阱——Rc/Arc与,是保障系统长期稳健运转的硬核必修课。

2301_81410839的博客 644

如何评估 AI Agent?agent_learning 的 Benchmark、LLM-as-Judge 与 A/B 测试完整指南

想知道你的 AI Agent 到底"好"还是"不好"?开源教程 [agent_learning](https://link.gitcode.com/i/521a4eeca7b31179b3c9d2631a9ec765) 的第 20 章(Agent 的评估与优化)给出了一套完整打法:用 **Benchmark 基准测试** 量化能力,用 **LLM-as-Judge** 自动评审开放式回答,再用 *

gitblog_00666的博客 681

Weak 弱引用:如何用 Weak 打破 Rc 与 Arc 的循环引用

在很多人的认知里,Rust ≈ 没有内存问题。但如果你写过稍微复杂一点的数据结构,你很快就会遇到一个现实:Rust 不会产生悬垂指针,但*仍然可能发生内存泄漏。而这类泄漏,往往就来自一个经典陷阱:Rc/Arc 的循环引用。

github_28443763的博客 905

Rust语言高级技巧 - 如何在Rust 中不使用unsafe 代码制造内存泄漏

本文通过Rust代码示例逐步演示如何构造循环引用导致内存泄漏。首先尝试在栈上分配内存失败,改为堆上分配后遇到Rc指针不可变问题,最后引入RefCell实现内部可变性,成功制造内存泄漏。文章指出内存泄漏需满足三个条件:引用计数指针、内部可变性和非static内容。尽管Rust无法完全避免内存泄漏,但其复杂性恰好符合"鼓励功能易用,不鼓励功能难用"的设计原则。相比内存安全,内存泄漏属于资源管理问题,而析构函数泄漏更为严重,可能影响程序正确性。Rust保证内存安全,但不承诺完全避免泄漏,这影响

2401_86049470的博客 766
上一篇: Rust 学习笔记:RefCell<T> 和内部可变性模式
下一篇: Rust 学习笔记:Thread
UestcXiye
博客等级 码龄8年 9028粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值