I puntatori intelligenti hanno aggiunto vantaggi rispetto ai puntatori normali. Ecco tutto ciò che devi sapere sui puntatori intelligenti in Rust.

La gestione della memoria è uno dei punti di forza di Rust, soprattutto perché la sicurezza non è compromessa. Il sistema di proprietà di Rust consente al compilatore di garantire la sicurezza del codice e l'assenza di errori di memoria come puntatori penzolanti e perdite di memoria.

Rust fornisce anche puntatori intelligenti con metadati e capacità aggiuntivi rispetto ai puntatori tradizionali. I puntatori intelligenti sono utili per affrontare le perdite di memoria.

Cosa sono i puntatori intelligenti in Rust?

I puntatori intelligenti sono uno dei I tipi di dati di Rust che estende le capacità dei puntatori regolari offrendo funzionalità aggiuntive come operatori sovraccaricati, distruttori e gestione automatica della memoria.

Rust utilizza le strutture per eseguire puntatori intelligenti; pertanto, anche i puntatori intelligenti hanno capacità di proprietà.

instagram viewer

Quando colleghi la memoria contenente dati allocati dinamicamente con puntatori intelligenti, questi vengono deallocati automaticamente. I puntatori intelligenti forniscono funzionalità per il controllo di Durata dell'oggetto di Rust, rendendoli utili per prevenire errori come la dereferenziazione del puntatore nullo e le perdite di memoria che sono popolari in altri linguaggi di basso livello come C e C++.

Vantaggi dell'utilizzo dei puntatori intelligenti

Ecco alcuni vantaggi dell'utilizzo dei puntatori intelligenti:

  1. Gestione automatica della memoria: i puntatori intelligenti forniscono la gestione automatica della memoria, comprese l'allocazione e la deallocazione, in contrasto con la gestione manuale della memoria con i normali puntatori.
  2. Maggiore sicurezza: i puntatori intelligenti applicano la semantica della proprietà, assicurando che solo un proprietario possa accedere alle risorse alla volta, prevenendo le tracce dei dati e i bug relativi alla concorrenza.
  3. Flessibilità: Rust fornisce più puntatori intelligenti, ciascuno con il proprio set di semantica della proprietà per scrivere codice sicuro in modo flessibile.
  4. Gestione delle risorse: è possibile utilizzare puntatori intelligenti per gestire altre risorse come gestori di file e socket di rete incapsulando le risorse all'interno di un puntatore intelligente che semplifica la gestione del loro ciclo di vita e garantisce che vengano correttamente chiusi e rilasciati successivamente utilizzo.
  5. Prestazione migliorata: i puntatori intelligenti aiutano a migliorare le prestazioni riducendo la copia e le allocazioni della memoria: il footprint di memoria ridotto dall'uso dei puntatori intelligenti si traduce in prestazioni migliori.

I puntatori intelligenti sono adatti per applicazioni di dimensioni medio-grandi, soprattutto nei casi in cui la gestione della memoria è fondamentale.

Tipi di puntatori intelligenti

Rust fornisce diversi tipi di puntatori intelligenti, inclusi Scatola, RC, RefCell, E Mutex.

1. Il puntatore intelligente della scatola

IL Scatola Smart Pointer è il puntatore intelligente più semplice e comune di Rust. IL Scatola il puntatore intelligente aiuta ad allocare i valori nell'heap e crea un puntatore a scatola per l'accessibilità.

IL Scatola Smart Pointer è utile per l'allocazione dinamica della memoria quando è necessario garantire che la memoria venga deallocata automaticamente quando i puntatori sono fuori ambito.

Ecco come puoi dichiarare e utilizzare a Scatola puntatore:

fnprincipale(){

// nuova istanza del puntatore smart box
permettere x = Scatola::nuovo(5);
stampa!(X)

}

IL Scatola type fa parte del preludio di Rust, quindi non dovrai importare il tipo, a differenza di altri puntatori intelligenti.

IL X variabile è a Scatola puntatore che punta al valore intero 5. Rust alloca la memoria per il valore sull'heap e dealloca automaticamente quando la variabile è fuori ambito.

2. Il puntatore intelligente Rc

IL RC (Reference Counted) puntatore intelligente fornisce funzionalità per la creazione di valori di proprietà condivisa. IL RC i puntatori intelligenti tengono traccia del numero di riferimenti a un valore e deallocano il valore quando l'ultimo riferimento è fuori ambito.

IL RC Il puntatore intelligente è utile quando è necessario condividere la proprietà di un valore per l'accessibilità in più parti del programma.

Per dichiarare un RC puntatore intelligente, importerai il file RC struct dalla libreria standard, dichiarare un nuovo RC puntatore con il nuovo funzione e clonare la variabile puntatore con il clone variabile.

utilizzo std:: rc:: Rc;

fnprincipale() {

// nuova istanza del puntatore intelligente RC
permettere x = Rc:: nuovo(5);
permettere y = Rc:: clone(&x);

stampa!("x = {}, y = {}", x, y);
}

IL X variabile è la RC variabile puntatore e il si variabile è un clone con accesso al valore in memoria. Il conteggio dei riferimenti è due e il valore viene deallocato dalla memoria quando le variabili non rientrano nell'ambito.

3. Il puntatore intelligente RefCell

IL RefCell il puntatore intelligente fornisce una mutabilità interna che consente la coesistenza di riferimenti immutabili e mutabili purché vi sia un riferimento mutabile per un dato momento.

IL RefCell il puntatore intelligente è utile quando si mutano valori posseduti da riferimenti mutabili.

IL Rifcell La funzione non fa parte del preludio di Rust, quindi dovrai importare la struttura dalla libreria standard per utilizzare il puntatore intelligente.

utilizzo std:: cella:: RefCell;

fnprincipale(){

// nuova istanza del puntatore intelligente Refcell
permettere x = RefCell:: nuovo(5);

permettere y = x.prendere in prestito();
permettere z = x.borrow_mut();

stampa!("y = {}", *y);
stampa!("z = {}", *z);

}

IL Rifcell puntatore intelligente contiene il valore e il si variabile è il riferimento immutabile al valore. IL prestito_mut La funzione crea un riferimento mutabile del valore.

Il programma è sicuro se c'è un solo riferimento mutabile alla volta.

4. Il puntatore intelligente Mutex

IL Mutex puntatore intelligente fornisce esclusioni reciproche. IL Mutex il puntatore intelligente è utile per sincronizzare l'accesso ai valori su più thread in programmi simultanei.

IL Mutex il puntatore intelligente fornisce l'esclusione reciproca per garantire che solo un thread possa accedere al valore impedendo le tracce dei dati.

Dovrai importare il file Mutex struct e creare una nuova istanza con il nuovo funzione da utilizzare Mutex Puntatore intelligente in ruggine.

utilizzo std:: sync:: Mutex;

fnprincipale() {

// nuova istanza del puntatore mutex
permettere contatore = Mutex:: nuovo(0);

{
permetteremut num = counter.lock().unwrap();
*num += 1;
}

stampa!("Risultato: {}", *counter.lock().unwrap());
}

IL contatore la variabile è la nuova Mutex esempio. IL principale funzione acquisisce un blocco sul mutex con il serratura metodo del Mutex esempio. Il blocco consente la modifica sicura del valore del contatore prima di rilasciare il blocco e stampare il valore.

IL Mutex type garantisce che un solo thread possa accedere alle risorse condivise (in questo caso, il contatore variabile) e modificarne il valore alla volta. L'esclusione reciproca garantisce che l'accesso simultaneo alle risorse condivise sia serializzato per evitare tracce di dati e altri problemi di concorrenza.

Il modello di proprietà di Rust garantisce la sicurezza della memoria

I puntatori intelligenti sono uno degli approcci di Rust alla sicurezza e alla flessibilità della memoria. Il modello di proprietà di Rust garantisce che i programmi utilizzino la memoria in modo sicuro con il controllo del prestito in fase di compilazione.

Il controllo del prestito è una caratteristica cruciale del modello di proprietà di Rust che applica rigide regole per l'accessibilità e la modifica della memoria.