OVH Cloud OVH Cloud

problème avec vector

4 réponses
Avatar
enochatearth
Bonjour,

J'essaie de comprendre ce qui cloche dans le programme ci-dessous,
j'obtiens une segmentation fault... Avec Valgrind je n'arrive pas =E0
savoir ce qui cloche. =C7a doit =EAtre trivial, mais je suis newbie en
C++, et en particulier avec les vector...

Merci d'avance,

Jules

#include <stdlib.h>
#include <vector>
#include <stdio.h>

#define MEMORY_CHECK(x) {\
if (x=3D=3DNULL)\
{\
printf("Allocation memoire demandee impossible!\n");\
exit(1);\
}\
}

using namespace std;

class test
{
public:
int a;
vector<test *> * section;
};

int main(void)
{
vector<test *> * p =3D ( vector<test *> * ) malloc(sizeof *p * 1);
MEMORY_CHECK(p);
test * tmptest =3D new test;
tmptest->a =3D 2;
p->push_back(tmptest);
(*p)[0]->section =3D ( vector<test *> * ) malloc(sizeof (vector<test
*>) * 1);
MEMORY_CHECK((*p)[0]->section);
vector<test *> * tmpsection =3D (*p)[0]->section;
(*tmpsection)[0]->a =3D 4;

// Lib=E9rer les pointeurs.
}

4 réponses

Avatar
Loïc Joly
Bonjour,

J'essaie de comprendre ce qui cloche dans le programme ci-dessous,
j'obtiens une segmentation fault... Avec Valgrind je n'arrive pas à
savoir ce qui cloche. Ça doit être trivial, mais je suis newbie en
C++, et en particulier avec les vector...


Un objet en C++ a besoin que son constructeur soit appelé. Or malloc ne
construit pas un objet, il ne fait qu'allouer de la mémoire. Donc si on
veut initialiser un pointeur avec un nouvel objet, il ne faut pas faire :

Objet *o = ( Objet* ) malloc(sizeof Objet); // Beark, pas bon

Mais :

Objet *o = new Objet; // Miam, bon

Ensuite, je ne comprend pas vraiment pourquoi tu déclares un
vector<test *> * p;

Au lieu d'un
vector<test *> p;
Voire un
vector<test> p;

Même si il peut y avoir intérêt à un vecteur de pointeur, un pointeur de
vecteur est moins souvent utile.
Une des règles de bonne conduite en C++ est de ne pas utiliser des
pointeurs à moins d'être certain d'en avoir besoin (polymorphisme,
décorréler la durée de vie du scope...).

--
Loïc

Avatar
enochatearth
Salut,

Merci pour ta réponse, maintenant ça marche.
En fait, je n'avais lu l'utilisation de new que pour des objets définis
par le programmeur:

test * tmptest = new test;

Je ne pensais pas qu'on pouvait (qu'il fallait) l'utiliser aussi pour
initialiser des vecteurs.

Quant à ton interrogation, j'ai utilisé un vecteur de pointeurs pour
pouvoir bénéficier du polymorphisme. En fait, j'ai des problèmes, et
cela ne marche pas comme je veux.
Mais pour l'instant, je cherche à faire fonctionner mon programme. Je
note toutes mes interrogations, et j'espère y avoir la réponse dans la
lecture d'un bouquin qui approfondit plus le sujet (pour l'instant je
n'ai lu qu'un bouquin introductif).

Merci,

Jules
Avatar
enochatearth
Salut,

Merci pour ta réponse, maintenant ça marche.
En fait, je n'avais lu l'utilisation de new que pour des objets définis
par le programmeur:

test * tmptest = new test;

Je ne pensais pas qu'on pouvait (qu'il fallait) l'utiliser aussi pour
initialiser des vecteurs.

Quant à ton interrogation, j'ai utilisé un vecteur de pointeurs pour
pouvoir bénéficier du polymorphisme. En fait, j'ai des problèmes, et
cela ne marche pas comme je veux.
Mais pour l'instant, je cherche à faire fonctionner mon programme. Je
note toutes mes interrogations, et j'espère y avoir la réponse dans la
lecture d'un bouquin qui approfondit plus le sujet (pour l'instant je
n'ai lu qu'un bouquin introductif).

Merci,

Jules
Avatar
Pierre THIERRY
Le Fri, 13 May 2005 04:26:23 -0700, enochatearth a écrit :
En fait, je n'avais lu l'utilisation de new que pour des objets
définis par le programmeur:


À ma connaissance, il n'y a pas de différence, pour le compilo, entre la
STL et tes classes. Tous sont définis exactement de la même façon.

Quant à ton interrogation, j'ai utilisé un vecteur de pointeurs pour
pouvoir bénéficier du polymorphisme.


Tu vas écrire des classes dérivées de vector ? Si c'est du polymorphisme
dans ta classe, dont tu as besoin, il n'est pas nécessaire d'avoir un
pointeur sur le vecteur...

(pour l'instant je n'ai lu qu'un bouquin introductif)


J'ai l'impression qu'il faut se méfier des intros sur C++ : on y voit
superficiellement traitées pleins de notions qu'on risque ensuite
d'utiliser à mauvais escient.

Brièvement,
Nowhere man
--

OpenPGP 0xD9D50D8A