La création de shared_ptr de pointeur brut
J'ai un pointeur vers un objet. Je tiens à le stocker dans deux récipients qui ont à la fois la propriété. Donc, je pense que je serais bon pour en faire un shared_ptr de C++0x. Comment pourrais-je convertir un pointeur brut pour un shared_pointer?
typedef unordered_map<string, shared_ptr<classA>>MAP1;
MAP1 map1;
classA* obj = new classA();
map1[ID] = how could I store obj in map1??
Grâce
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour vous assurer de ne pas initialiser les shared_ptr objets avec le même pointeur brut, ou il sera supprimé à deux reprises. Une meilleure (mais tout de même mauvaise) façon de le faire:
AVERTISSEMENT: le code ci-dessus montre une mauvaise pratique!
raw_ptr
ne devraient tout simplement pas exister en tant que variable. Si vous directement initialiser les pointeurs intelligents avec le résultat denew
, vous réduisez votre risque de accidentellement de l'initialisation d'autres pointeurs intelligents de manière incorrecte. Ce que vous devez faire est:Ce qui est bien c'est que le code est plus concis que bien.
MODIFIER
Je devrais probablement des précisions sur la façon dont il fonctionne avec une carte. Si vous aviez un pointeur brut et deux cartes, vous pourriez faire quelque chose de semblable à ce que j'ai montré ci-dessus.
my_ptr(new ClassA());
de Cette façon, un responsable est de faire du travail supplémentaire pour visser les choses.// or shared_ptr<classA> my_ptr = raw_ptr;
est mal dansstd::shared_ptr
, car il doit être explicite comme// or shared_ptr<classA> my_ptr(raw_ptr);
.Vous pouvez utiliser une variété de façons, mais le reset() serait bon:
Et pour résoudre le problème d'avoir deux cartes se réfèrent à la même shared_ptr, nous pouvons avoir:
Remarque que le truc en général pour éviter une double supprimer est d'essayer d'éviter les pointeurs à tous.
Donc à éviter:
mais au lieu de mettre le nouveau segment de l'objet directement dans un shared_ptr.