`
wudixiaotie
  • 浏览: 139916 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

rust的指针作为函数参数是直接传递,还是先销毁后创建?

    博客分类:
  • rust
 
阅读更多

 这是我自己想到的问题,结果去知呼提问,还没等别人回答, 我自己就想到方法实验了。。

fn main() {
    let mut a = 34;
    println!("a's addr:{:p}", &a);
    let p = &mut a;
    println!("p's addr:{:p}", &p);
    println!("out test_pointer p's addr:{:p}", &test_pointer(p));

    let b = 1;
    let bp = &b;
    println!("in main bp's addr:{:p}", p);
    pointer_addr(bp);
    pointer_addr1(bp);
}

fn test_pointer(p: &mut i32) -> &mut i32 {
    *p = 32;
    println!("in test_pointer p's addr:{:p}", &p);
    p
}

fn pointer_addr(p: &i32) -> &i32 {
    println!("in pointer_addr p's addr:{:p}", p);
    p
}

fn pointer_addr1(p: &i32) -> &i32 {
    println!("in pointer_addr1 p's addr:{:p}", p);
    p
}

 结果:

cargo run
   Compiling pointer v0.1.0 (file:///home/xiaotie/code/my/learn_rust/pointer)
     Running `target/debug/pointer`
a's addr:0x7ffd05efe8fc
p's addr:0x7ffd05efe868
in test_pointer p's addr:0x7ffd05efe728
out test_pointer p's addr:0x7ffd05efe778
in pointer_addr p's addr:0x7ffc03bbd504
in pointer_addr1 p's addr:0x7ffc03bbd504

 事实证明指针在函数返回的过程中是不是销毁在创建也不是直接传递,而是在作用域外再创建一个指针,但是这个指针不会在函数结束后销毁,而是无效,但是会被复用。

2
1
分享到:
评论

相关推荐

    Rust_memory_use.pdf

    随着函数的执行,这些变量被创建并初始化,然后在函数返回时被销毁。 4. **内存安全**:Rust的核心特性之一是内存安全,它通过所有权系统、生命周期和借用规则来确保程序不会出现常见的内存错误,如空指针异常、...

    Rust程序设计

    安装完成后,可通过`rustup`工具管理Rust的不同版本及组件。 - **Hello, World!**:这是学习任何一门新语言的起点。Rust的Hello, World!程序通常如下: ```rust fn main() { println!("Hello, world!"); } ``` ...

    Rust的生命周期练习和讲解

    **解析**:原函数试图返回一个内部String对象的引用,但String对象是在函数内部创建并在函数结束时销毁的,因此返回的引用将无效。修正的方法是直接返回字符串字面值的引用,由于字符串字面值在Rust中拥有`'static`...

    The Rust Programming Language.2015

    - **Ruby**:使用 Rust 作为 C 扩展来提高性能。 - **Python**:通过 FFI(Foreign Function Interface)调用 Rust 函数。 - **Node.js**:将 Rust 编译为 WebAssembly,在浏览器中运行。 #### 四、高效使用 ...

    Rust语言教程&案例&相关项目资源

    Rust的设计允许开发人员避免常见的编程错误,如空指针异常、数据竞争和缓冲区溢出,这在其他语言中可能导致严重的问题。 本压缩包文件包含的资源旨在提供全面的Rust学习路径,包括教程、实例和项目资源,帮助你快速...

    一文掌握Rust编程中的生命周期.pdf

    ### Rust编程中的生命周期详解 #### 一、生命周期概念与重要性 在Rust语言中,生命周期(Lifetime)是一个核心概念,它确保了引用的有效性,是实现内存安全的关键所在。简单来说,生命周期指的是引用在程序执行...

    beginning_rust_programming

    Rust支持函数默认参数、泛型和闭包(匿名函数)。 四、所有权与生命周期 Rust的所有权系统是其独特之处,它规定了如何创建、共享和销毁值。每个值都有一个所有者,且在任何时候只能有一个所有者。当所有者离开作用...

    rust-sel4:锈seL4绑定

    通过`Cap`,开发者可以安全地创建、复制、销毁和修改seL4的权限,避免了C语言中可能存在的资源泄露和权限滥用问题。 在压缩包文件"rust-sel4-master"中,包含的是rust-sel4项目的源代码和相关文档。通过查看源码,...

    rust-style:Rust代码的样式指南

    4. **所有权和生命周期**:Rust的核心特性之一是所有权系统,它决定了值的创建、使用和销毁。生命周期标注用于约束引用的有效时间,以确保内存安全。 5. **模式匹配**:Rust的`match`表达式允许对多种情况进行优雅...

    rust_programming:锈编程

    Rust的函数可以有默认参数、可变数量参数,并且可以作为第一类公民,即可以赋值给变量、作为参数传递和返回。闭包是匿名函数,可以捕获其环境中的变量,允许函数式编程风格。 五、宏与元编程 Rust的宏系统允许...

    rust-book:我在Rust Book上的工作

    5. **函数与闭包**:Rust中的函数可以接受闭包作为参数,闭包是一种可以捕获其周围环境的匿名函数。闭包可以捕获变量的引用,允许它们在函数内部使用外部数据。 6. **模式匹配**:Rust的`match`关键字用于模式匹配...

    Rust_programming_language

    闭包可以作为参数传递,也可以返回,甚至可以拥有自己的生命周期。 6. **宏**:Rust的宏系统允许在编译时执行代码,用于生成其他代码,提高了代码的抽象能力。 7. **Cargo**:Cargo是Rust的标准构建工具,它管理...

    rust-by-example-ko:Example제로배우는러스트(以Rust为例)한국어판

    Rust中的函数可以接受闭包(匿名函数)作为参数,这使得处理回调和迭代变得简单。闭包可以捕获其作用域内的变量,遵循相同的所有权规则。 6. **泛型**: 泛型允许创建可重用的代码,它们可以在多种类型上工作,而...

    rusty-llvm:从 Rust 到 LLVM 的“安全”绑定

    EmptyEnum然后为它实现了Drop ,当盒子被销毁时,它会调用 C api 中的析构函数。 我不喜欢这个实现的一些事情的简短列表: 太多的mem::transmute让我对自己感到舒服 所有引用都是共享引用&Context而不是独占引用&...

    Pooler:玩Rust

    在编程中,对象池是一种优化资源管理的技术,主要用于减少频繁创建和销毁对象时产生的性能开销。Rust 是一种系统级编程语言,注重安全、速度和并发性,因此在需要高效内存管理和高性能场景下,Rust 的对象池实现具有...

    Rust-Tutorial

    4. **函数与闭包**:Rust的函数支持模式匹配、类型推导和默认参数。闭包是Rust中的匿名函数,可以捕获其环境中的变量,这在处理回调和并发时非常有用。 5. **类型系统**:Rust有静态类型,所有值都有其特定类型,...

    hello

    3. **函数与函数签名**:Rust中的函数定义以`fn`开头,后跟函数名和参数列表。每个函数都有一个返回类型,即使它看起来没有显式的返回值。例如,`fn main() {}`的返回类型是`()`,表示无返回值。 4. **main函数**:...

    monkey-rs:Rust的interpreterbook.com的Monkey编程语言

    解释器需要处理对象的创建、销毁和引用计数,确保无内存泄漏。 9. **错误处理**:在解析、类型检查或执行期间,可能会遇到错误。Rust的错误处理机制(如Result和Option枚举)鼓励显式处理错误,而不是默默忽略。 ...

    rost:用Rust编写的业余爱好操作系统

    5. **进程管理**:虽然作为业余爱好项目,rost可能不会实现复杂的多任务,但至少需要处理基本的进程控制,如创建、调度和销毁进程。 6. **文件系统**:rost可能需要支持某种形式的文件系统,无论是简单的FAT16/32...

    cphsoft:软教育

    3. **函数与闭包**:Rust的函数可以接受函数作为参数,返回函数,并且支持闭包,这是一种可以捕获其所在作用域内的变量的匿名函数。 4. **宏**:Rust的宏系统允许在编译时进行代码生成,提高了代码的可复用性和效率...

Global site tag (gtag.js) - Google Analytics