Gestion des panneaux et sécurité mémoire en Rust

RustRustBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, nous étudions la macro panic! en Rust, qui peut être utilisée pour générer une panique et commencer à dérouler sa pile, entraînant la sortie du programme en rapportant le message de panique. Le runtime prend soin de libérer toutes les ressources appartenant au fil en appelant le destructeur de ses objets. Nous examinons également un exemple d'utilisation de la macro panic! pour gérer la division par zéro et vérifions qu'elle ne résulte pas de fuites mémoire en utilisant Valgrind.

Note : Si le laboratoire ne spécifie pas de nom de fichier, vous pouvez utiliser n'importe quel nom de fichier que vous voulez. Par exemple, vous pouvez utiliser main.rs, le compiler et l'exécuter avec rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/ErrorHandlingandDebuggingGroup(["Error Handling and Debugging"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/ErrorHandlingandDebuggingGroup -.-> rust/panic_usage("panic! Usage") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-488373{{"Gestion des panneaux et sécurité mémoire en Rust"}} rust/integer_types -.-> lab-488373{{"Gestion des panneaux et sécurité mémoire en Rust"}} rust/string_type -.-> lab-488373{{"Gestion des panneaux et sécurité mémoire en Rust"}} rust/function_syntax -.-> lab-488373{{"Gestion des panneaux et sécurité mémoire en Rust"}} rust/expressions_statements -.-> lab-488373{{"Gestion des panneaux et sécurité mémoire en Rust"}} rust/lifetime_specifiers -.-> lab-488373{{"Gestion des panneaux et sécurité mémoire en Rust"}} rust/method_syntax -.-> lab-488373{{"Gestion des panneaux et sécurité mémoire en Rust"}} rust/panic_usage -.-> lab-488373{{"Gestion des panneaux et sécurité mémoire en Rust"}} rust/operator_overloading -.-> lab-488373{{"Gestion des panneaux et sécurité mémoire en Rust"}} end

panic!

La macro panic! peut être utilisée pour générer une panique et commencer à dérouler sa pile. Pendant le déroulement, le runtime prendra soin de libérer toutes les ressources propriées par le fil en appelant le destructeur de tous ses objets.

Puisque nous traitons de programmes avec un seul fil, panic! entraînera la sortie du programme en rapportant le message de panique.

// Re-implementation of integer division (/)
fn division(dividend: i32, divisor: i32) -> i32 {
    if divisor == 0 {
        // Division by zero triggers a panic
        panic!("division by zero");
    } else {
        dividend / divisor
    }
}

// The `main` task
fn main() {
    // Heap allocated integer
    let _x = Box::new(0i32);

    // This operation will trigger a task failure
    division(3, 0);

    println!("This point won't be reached!");

    // `_x` should get destroyed at this point
}

Vérifions que panic! ne fuit pas de mémoire.

<!-- REUSE-IgnoreStart -->
<!-- Prevent REUSE from parsing the copyright statement in the sample code -->
$ rustc panic.rs && valgrind./panic
==4401== Memcheck, a memory error detector
==4401== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==4401== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==4401== Command:./panic
==4401==
thread '<main>' panicked at 'division by zero', panic.rs:5
==4401==
==4401== HEAP SUMMARY:
==4401==     in use at exit: 0 bytes in 0 blocks
==4401==   total heap usage: 18 allocs, 18 frees, 1,648 bytes allocated
==4401==
==4401== All heap blocks were freed -- no leaks are possible
==4401==
==4401== For counts of detected and suppressed errors, rerun with: -v
==4401== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
<!-- REUSE-IgnoreEnd -->

Résumé

Félicitations ! Vous avez terminé le laboratoire Panic!. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.