https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization

Il existe un exemple du fonctionnement de RAII. J'ai toujours pensé que C ++ obtient ce comportement de C. Que lorsque vous définissez une variable dans une fonction, cette variable devient invalide lorsque vous quittez la fonction. Mais peut-être que le concept n'a pas de sens quand il n'y a pas d'objet. C n'initialise pas les structures mais C ++ le fait. C'est ça la différence? Je suis un peu confus.

c++ c
1
Sia 1 avril 2020 à 23:50

3 réponses

Meilleure réponse

J'ai toujours pensé que ... que lorsque vous définissez une variable dans une fonction, cette variable devient invalide lorsque vous quittez la fonction

Vous avez bien pensé.

Vous semblez ne pas savoir à quoi sert RAII. Il est destiné à la gestion des ressources dynamiques telles que les allocations de mémoire dynamique. Il s'appuie sur des fonctionnalités de langage telles que les constructeurs et les destructeurs, qui n'existent pas dans C.

3
eerorika 1 avril 2020 à 21:23

En C, cette erreur de programmation peut facilement se produire.

typedef struct
{
  int *data;
} Trivial_C;

void
my_c_function(void)
{
  Trivial_C t;
  t.data=malloc(5*sizeof(int));
  ... do something with t.data ...
} // oops! t does not exist anymore but the allocated
  // memory that was known through t.data still exists!

En C ++, RAII s'appuie sur des destructeurs pour effectuer un certain nettoyage lorsqu'un objet disparaît.

struct Trivial_Cpp
{
  int *data;
  Trivial_Cpp() : data{new int[5]} {} // data is allocated at creation
  ~Trivial_Cpp() { delete[] data; }   // data is released at destruction
};

void
my_cpp_function()
{
  Trivial_Cpp t;
  ... do something with t.data ...
} // OK, t does not exist anymore and the destructor has
  // been called, so the allocated memory has been released

Bien sûr, ces extraits de code sont triviaux et largement incomplets.
De plus, vous avez rarement besoin d'allouer de la mémoire par vous-même; std::vector par exemple le fera parfaitement pour vous (car il utilise RAII).

2
prog-fh 1 avril 2020 à 21:30

La différence est que C ++ a des constructeurs et des destructeurs.

C ne garantit pas que quoi que ce soit sera fait à l'entrée et à la sortie de l'oscilloscope. Si vous déclarez une variable et ne lui assignez rien, vous pouvez lire des déchets lorsque vous essayez de lire cette variable. Lorsque vous quittez une étendue, rien n'est fait pour ce qui était sur la pile dans l'étendue que vous venez de quitter.

En C ++, les types triviaux comme int se comportent de la même manière. Avec types de classes (classes, struct, unions), une variable de type est créé avec un constructeur et détruit avec un destructeur. Si vous déclarez une variable d'une manière qui appelle un constructeur non trivial , alors ce constructeur effectue l'initialisation sur la variable. Si vous déclarez une variable de portée d'un type a un destructeur non trivial , ce destructeur est exécuté à la sortie de la portée pour nettoyer la variable. L'utilisation de ce mécanisme de construction et de destruction est ce que l'on entend généralement par RAII en C ++.

2
Zuodian Hu 1 avril 2020 à 21:24