4 votes

le comptage des références ne fonctionne pas dans shared_ptr

Le code ci-dessous entraîne une erreur d'exécution.

Chaque shared_ptr détient la même mémoire, mais le compte pour chacun d'eux est toujours de un.

Ainsi, chaque pointeur partagé est différent, donc lorsqu'ils sortent du champ d'application, ils essaient de libérer le bloc et cela entraîne une corruption du tas. Ma question est la suivante : comment éviter cela ?

Je veux juste ajouter une déclaration comme celle-ci

shared_ptr<int> x(p);

est non négociable, je dois le déclarer.

#include <iostream>
#include <memory>
using namespace std;
int main ()
{
  int* p = new int (10);
  shared_ptr<int> a (p);
  shared_ptr<int> b (p);
  shared_ptr<int> c (p);
  shared_ptr<int> d (p);
  cout<<"Count : "<<a.use_count()<<endl;
  cout<<"Count : "<<b.use_count()<<endl;
  cout<<"Count : "<<c.use_count()<<endl;
  cout<<"Count : "<<d.use_count()<<endl;
  return 0;
}

10voto

user2079303 Points 4916

Vous ne pouvez mettre en cage un pointeur intelligent à partir d'un pointeur brut que si vous avez la propriété du pointeur. Dès que vous créez le pointeur intelligent, la propriété est transférée au pointeur intelligent. Puisque vous n'avez plus la propriété, vous ne pouvez pas créer d'autres pointeurs intelligents à partir du pointeur brut.

Pour obtenir un pointeur partagé sur une mémoire qui est déjà gérée/propriétaire d'un pointeur partagé, vous devez copier le pointeur partagé existant :

shared_ptr<int> b = a;
shared_ptr<int> c = a;
// ....

Si vous créez simplement plusieurs pointeurs partagés à partir du pointeur brut, alors aucun de ces pointeurs partagés ne connaîtra l'existence des autres, et tous croiront être le seul propriétaire de cette mémoire et les problèmes que vous décrivez se produiront.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X