Si, lorsqu'il y a un delete dans un destructeur, tu penses qu'il y a violation du RAII, alors std::vector<int> viole RAII.
RAII consiste justement à acquérir les ressources dans le constructeur (new) et à les libérer dans le destructeur (delete).
C'est ce qu'implémente std::vector<int> et c'est pour cela que tu peux utiliser m_toto ainsi.
Il y a une forme de transitivité : si toutes les données membres d'une classe respectent le RAII, alors elle le respecte aussi.
Mais il ne faut pas oublier qu'il y a bien acquisition/libération de ressources pour chacun de ses membres, directement ou indirectement.
La classe Foo est implémentée exactement sur le même modèle que std::vector<int>, c'est-à-dire sur le RAII.
Tout est basé sur un mécanisme implicite du C++ : les destructeurs des objets sont appelés implicitement à la fin de leur vie.
La ligne
{ std::vector<int> m_vector; }
appelle le destructeur de std::vector<int>, destructeur qui libère directement ou indirectement une ressource avec delete.
La violation du RAII, c'est l'acquisition de ressources après l'initialisation,
1 2 3 4 5 6 7 8 9 10
| class Foo
{
public:
void initialize(size_t size)
{ m_tab = new int[size]; }
~Foo()
{ delete []*m_tab; }
private:
int* m_tab;
}; |
ou la libération de ressources avant la destruction,
1 2 3 4 5 6 7 8 9 10 11 12
| class Foo
{
public:
Foo(size_t size)
: m_tab(new int[size])
{}
void destroy()
{ delete [] m_tab; }
private:
int* m_tab;
}; |
ou la combinaison des deux :
1 2 3 4 5 6 7 8 9 10 11
| class Foo
{
public:
void initialize(size_t size)
{ m_tab = new int[size] };
void destroy()
{ delete [] m_tab; }
private:
int* m_tab;
}; |
Partager