41 votes

Pourquoi le C++ n'exige-t-il pas une "nouvelle" instruction pour initialiser std::vector ?

/* bar.h */
class bar{
    /* standard stuff omitted */
    std::vector<my_obj*> foo;
};

/* bar.cpp */
bar::bar(){ 
    // foo = new std::vector<my_obj*>(); <-- why don't I need this line??
    foo.push_back(new my_obj());
}

Pourquoi ce code fonctionne-t-il même si nous n'avons pas assigné à foo une nouvelle instance de std::vector ?

8voto

Oli Charlesworth Points 148744

Parce que bar contient un std::vector , pas un std::vector * .

Ce n'est vraiment pas différent de quelque chose comme ça :

 class bar
{
    int foo;  // No need to create a "new int"
};

6voto

Loki Astari Points 116129

Parce que foo est un objet et non un pointeur.

 std::vector<my_obj*>    // This is an object
std::vector<my_obj*> *  // This is a pointer to an object
                    ^^^ // Notice the extra star.

New renvoie un pointeur :

 new std::vector<my_obj*>();  // returns std::vector<my_obj*> *

PS. Votre vecteur devrait probablement contenir des objets et non des pointeurs.

 std::vector<my_obj>   foo;
...
foo.push_back(my_obj());

Sinon, vous devrez supprimer manuellement tous les objets du vecteur lorsqu'il sort de la portée (lorsque l'objet contenant est détruit). c'est-à-dire que si vous souhaitez conserver des pointeurs dans votre vecteur, vous devez effectuer l'une des opérations suivantes :

 // 1. Manually delete all the elements in the vector when the object is destroyed.
~bar::bar()
{
    for(std::vector<my_obj*>::iterator loop = foo.begin(); loop != foo.end(); ++loop)
    {
        delete (*loop);
    }
}

// 2. Use a smart pointer:
std::vector<std::shared_ptr<my_obj> >  foo;

// 3. Use a smart container for pointers
boost::ptr_vector<my_obj>   foo

3voto

ScarletAmaranth Points 3568

Parce que std::vector fait pour vous :) Vous n'avez pas de pointeur vers std::vector , vous configurez simplement un objet de type std::vector , qui en interne alloue de la mémoire pour vous.

1voto

AAlkhabbaz Points 197

std::vector dans cette bibliothèque n'est pas un pointeur

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