Manejo de errores y seguridad de memoria en Rust

RustRustBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprendemos sobre la macro panic! en Rust, que se puede utilizar para generar un error y comenzar a deshacerse de su pila, lo que hace que el programa informe el mensaje de error y salga. La ejecución del programa se encarga de liberar todos los recursos propiedad del hilo llamando al destructor de sus objetos. También examinamos un ejemplo de uso de la macro panic! para manejar la división por cero y verificamos que no se produzcan fugas de memoria utilizando Valgrind.

Nota: Si el laboratorio no especifica un nombre de archivo, puede utilizar cualquier nombre de archivo que desee. Por ejemplo, puede utilizar main.rs, compilar y ejecutarlo con rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/ErrorHandlingandDebuggingGroup(["Error Handling and Debugging"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) 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{{"Manejo de errores y seguridad de memoria en Rust"}} rust/integer_types -.-> lab-488373{{"Manejo de errores y seguridad de memoria en Rust"}} rust/string_type -.-> lab-488373{{"Manejo de errores y seguridad de memoria en Rust"}} rust/function_syntax -.-> lab-488373{{"Manejo de errores y seguridad de memoria en Rust"}} rust/expressions_statements -.-> lab-488373{{"Manejo de errores y seguridad de memoria en Rust"}} rust/lifetime_specifiers -.-> lab-488373{{"Manejo de errores y seguridad de memoria en Rust"}} rust/method_syntax -.-> lab-488373{{"Manejo de errores y seguridad de memoria en Rust"}} rust/panic_usage -.-> lab-488373{{"Manejo de errores y seguridad de memoria en Rust"}} rust/operator_overloading -.-> lab-488373{{"Manejo de errores y seguridad de memoria en Rust"}} end

panic!

La macro panic! se puede utilizar para generar un error y comenzar a deshacerse de su pila. Mientras se deshace, la ejecución del programa se encargará de liberar todos los recursos propios del hilo llamando al destructor de todos sus objetos.

Dado que estamos trabajando con programas de un solo hilo, panic! hará que el programa informe el mensaje de error y salga.

// Re-implementación de la división entera (/)
fn division(dividendo: i32, divisor: i32) -> i32 {
    if divisor == 0 {
        // La división por cero desencadena un error
        panic!("división por cero");
    } else {
        dividendo / divisor
    }
}

// La tarea `main`
fn main() {
    // Entero asignado en el montón
    let _x = Box::new(0i32);

    // Esta operación desencadenará un error en la tarea
    division(3, 0);

    println!("Este punto no se alcanzará!");

    // `_x` debería ser destruido en este punto
}

Veamos que panic! no produce fugas de memoria.

<!-- REUSE-IgnoreStart -->
<!-- Evita que REUSE analice el enunciado de derechos de autor en el código de muestra -->
$ rustc panic.rs && valgrind./panic
==4401== Memcheck, un detector de errores de memoria
==4401== Copyright (C) 2002-2013, y bajo licencia GNU GPL, por Julian Seward et al.
==4401== Usando Valgrind-3.10.0.SVN y LibVEX; vuelva a ejecutar con -h para información de derechos de autor
==4401== Comando:./panic
==4401==
hilo '<main>' se desató con 'división por cero', panic.rs:5
==4401==
==4401== RESUMEN DEL MONTÓN:
==4401==     en uso al finalizar: 0 bytes en 0 bloques
==4401==   uso total del montón: 18 asignaciones, 18 liberaciones, 1,648 bytes asignados
==4401==
==4401== Todos los bloques de montón se liberaron -- no es posible tener fugas
==4401==
==4401== Para ver los recuentos de errores detectados y suprimidos, vuelva a ejecutar con: -v
==4401== RESUMEN DE ERRORES: 0 errores de 0 contextos (suprimidos: 0 de 0)
<!-- REUSE-IgnoreEnd -->

Resumen

¡Felicidades! Has completado el laboratorio Panic!. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.