Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
rust
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
orestis.malaspin
rust
Commits
2f83d210
There was a problem fetching the pipeline summary.
Commit
2f83d210
authored
6 years ago
by
orestis.malaspin
Browse files
Options
Downloads
Patches
Plain Diff
ajout smart pointers
parent
5660c215
Branches
Branches containing commit
No related tags found
No related merge requests found
Pipeline
#
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
index.md
+1
-0
1 addition, 0 deletions
index.md
smart_pointers.md
+114
-0
114 additions, 0 deletions
smart_pointers.md
with
115 additions
and
0 deletions
index.md
+
1
−
0
View file @
2f83d210
...
...
@@ -20,6 +20,7 @@ sansfont: Sans Serif
-
[
4.1 Commentaires
](
commentaires.html
)
.
-
[
4.2 Gestion d'erreurs
](
errors.html
)
.
-
[
6.1 Méthodes
](
methods.html
)
.
-
[
6.2 Pointeurs intelligents
](
smart_pointers.html
)
.
-
[
6.2 Collections: String, Vector, HashMap
](
collections.html
)
.
-
[
7.1 Tests
](
tests.html
)
.
-
[
8.1 Itérateurs
](
iterators.html
)
.
...
...
This diff is collapsed.
Click to expand it.
smart_pointers.md
0 → 100644
+
114
−
0
View file @
2f83d210
---
title
:
Cours de programmation séquentielle
subtitle
:
Pointeurs intelligents
author
:
Orestis Malaspinas
sansfont
:
Sans Serif
---
# Pointeurs
## Généralités
-
Un
**pointeur**
est une variable qui contient une adresse mémoire.
-
Cette adresse
**pointe**
vers des données.

{width=50%}
-
Question: Quel type de pointeur avons-nous déjà rencontré?
-
Réponse: La référence.
## Smart pointers
-
Un
**pointeur intelligent**
est un type abstrait qui rajoute des fonctionnalités au poiteur standard.
-
Management automatique de la mémoire.
-
Vérification de limites.
-
En particulier, ils permettent la désallocation de la mémoire de manière automatique:
-
On peut avoir plusieurs pointeurs sur un espace mémoire.
-
Quand le dernier pointeurs est détruit, l'espace mémoire est désalloué.
-
Permet d'empêcher les fuites mémoires.
-
Il existe différents types:
-
Un poiteur unique est le propriétaire de ses données (quand il est détruit les données aussi).
-
On compte le nombre de références sur des données, quand ce nombre tombe à zéro on détruit tout.
## En Rust
-
Exemples:
-
`Vec<T>`
{.rust},
`String`
{.rust}: ces types possèdent de la mémoire et la manipule eux-mêmes.
-
Les pointeurs intelligent doivent implémenter deux traits:
-
`Deref`
{.ruist}: comment on déréférence le pointeur.
-
`Drop`
{.rust}: comment on détruit le pointeur.
-
Les trois cas les plus typiques (il y en a d'autres):
-
`Box<T>`
{.rust} pointeur unique qui alloue des données sur la pile.
-
`Rc<T>`
{.rust} "reference counted" type, qui permet de partager la propriété.
-
`Ref<T>`
{.rust} et
`RefMut<T>`
{.rust} qui permet d'imposer les règles de propriété à l'exécution plutôt qu'à la compilation.
# Le type `Box<T>`{.rust}
## Généralités
-
Utile pour stocker des données sur le tas.
-
La seule chose stockée sur la pile est le pointeur sur les données du tas.
-
Cas typiques d'utilisation:
-
Quand la taille d'un type est inconnu à la compilation.
-
Quand on veut transférer la propriété de grandes quantité de données mais s'assurer que les données ne seront pas copiées (juste le pointeur).
## Utilisation
<pre><code
data-trim=
"hljs rust"
class=
"lang-rust"
>
fn main()
{
let num = Box::new(10);
println!("num = {}", num); // déréférenciation automatique
println!("num = {}",
*
num); // déréférenciation explicite
let x = 10;
// seule la déréférenciation explicite marche
println!("Is {} equal to {}?. Answer: {}", num, x, *num == x);
let y = &x;
// La seule différence est qu'ici nous avons une référence
println!("Is {} equal to {}?. Answer: {}", y, x, *y == x);
}
</code></pre>
-
Dans l'appel de fonctions/méthodes la déréférenciation se fait automatiquement.
-
Sinon elle doit être explicite.
## Car pratique: la liste chaînée
-
Rust doit connaître la taille d'un type
**à la compilation**
.
-
Ici nous avons à faire à un type
**récursif**
: sa taille est potentiellement infinie.
<pre><code
data-trim=
"hljs rust"
class=
"lang-rust"
>
enum List {
Elem(i32, List),
Nil,
}
use List::{Elem, Nil};
fn main()
{
let list = Elem(1, Elem(2, Elem(3, Nil)));
}
</code></pre>
## Car pratique: la liste chaînée
-
Avec un
`Box<T>`
{.rust} sa taille est connue.
<pre><code
data-trim=
"hljs rust"
class=
"lang-rust"
>
#[derive(Debug)]
enum List {
Elem(i32, Box
<
List
>
),
Nil,
}
use List::{Elem, Nil};
fn main()
{
let list = Elem(1, Box::new(Elem(2, Box::new(Elem(3, Box::new(Nil))))));
println!("{:?}", list);
}
</code></pre>
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment