Unique_ptr

Unique_ptr

by Luc Luigi Guyot -
Number of replies: 3

Bonjour je ne comprends pas pourquoi cette portion de code compile:

int main(){

       double test(2.0);

unique_ptr<double> pointe1(&test);

unique_ptr<double> pointe2(&test);

return 0;}

Pour moi les pointeurs pointe1 et pointe2 pointent sur la même zône mémoire (l'adresse de test)

In reply to Luc Luigi Guyot

Re: Unique_ptr

by Fares Ahmed -

Bonsoir,

tout d'abord attention : le fait que du code compile ne signifie pas que le code est correct, étant donné que certaines erreurs (celle là par exemple) ne peuvent pas être détectée par le compilateur. Si vous essayiez d'exécuter votre code vous devriez avoir un segmentation fault, dû au fait ici que lors du return les destructeurs de vos pointeurs essayent de libérer de la mémoire allouée statiquement (et un double free au passage).


Les unique_ptr garantissent une seule référence sur un pointeur uniquement si vous leur transférez entièrement la propriété du pointeur (ce qui n'est pas le cas ici vu que vous la transférez à deux objets différents). C'est donc à vous de faire attention à ne pas vous retrouvez dans cette situation.

In reply to Fares Ahmed

Re: Unique_ptr

by Jean-Cédric Chappelier -

Je rajoute que les unique_ptr (et tous les autres pointeurs « intelligents ») ne sont à utiliser QUE dans le « cas numéro 3 » de l'utilisation des pointeurs (allocation dynamique).
Là vous n'êtes pas dans ce cas (mais dans le « cas 1 ») car c'est de l'allocation statique (objet créé par le compilateur) que vous utilisez.

2e complément : en fait les unique_ptr ne sont « uniques » qu'entre eux ; que dans ce sens qu'ils ne peuvent pas être copiés (vous ne pouvez pas copier pointe2 dans pointe1). Si vous commencez à mélanger des pointeurs à la C (&test est un pointeur à la C) avec des pointeurs « intelligents », vous êtes en train de « diriger le fusil vers votre pied » (vous ne vous êtes peut être pas encore « tiré dans le pied », mais presque ;-) ).