j'ai créé une classe qui contient un pointeur vers de la mémoire dynamique (celle-ci étant allouée dans le constructeur de ma classe).
J'ai remarqué que lorsque que je crée un vector stl de n éléments de ma classe, le programme ne passe qu'une fois dans le constructeur de ma classe (mais il y a bien n éléments dans mon vector), du coup ma mémoire dynamique n'est pas allouée correctement.
Quequ'un aurait une idée du problème?
Tu as essayé tes objets après les avoir créé ?
Tu peux montrer la partie de code qui "déconnerait" ?
__________________________
Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
N'oubliez pas le Tag [Résolu].
#include <vector>
using namespace std;
class class1
{
public:
class1(unsigned int arraySize) {arrayInt = (int*)calloc(arraySize, sizeof(int));}
~class1() {}
protected:
int* arrayInt;
};
void main(void)
{
int class1Nb = 10;
unsigned int arraySize = 50;
vector<class1> *vecClass1;
vecClass1 = new vector<class1>(class1Nb, arraySize);
}
j'ai effectivement essayé mes objets après les avoir instanciés, la mémoire n'a été allouée pour aucun des objets...
Je pense que mon problème principal vient du fait que mon constructeur possède 1 argument... Alors y a-t'il possibilité de passer l'argument du constructeur de ma classe lors de l'instanciation du vector? Je crois que c'est le passage de l'agument de mon constructeur qui est foireux...
Bien sûr, je pourrais allouer ma mémoire en dehors du constructeur, mais alors ça me donnerais un code moins sûr (ben oui, je pourrais oublier d'appeler cette seconde méthode).
Je ne veux pas dire de connerie n'ayant pas l'habitude des templates, mais ce que fait ton code c'est :
un vecteur de class1 qui ne possède qu'un élément class1 qui lui possède un tableau de ArraySize int.
__________________________
Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
N'oubliez pas le Tag [Résolu].
En gros il a un vector content des class1, qui pour l'instant a une taille de 10 : il pourra contenir 10 objets de type class1.
Et ce qu'il veut c'est instancier ces class1 qui se trouvent dedans avec une valeur par défaut, il me semble... Une simple boucle devrait suffir.
int class1Nb = 10;
unsigned int arraySize = 50;
vector<class1> *vecClass1;
vecClass1 = new vector<class1>(class1Nb);
for(int i=0;i<class1Nb;i++) {
// instanciation de vecClass1[i] de la manière dont tu souhaite.
// par exemple vecClass1[i] = new class1(arg du constructeur)
}
Soit c'est qqch comme ça soit j'ai mal compris le pb
en fait ton premier code, créé bien 10 elements de ta classe "class1"; mais ensuite le template vector utilise le constructeur par copie de ta classe (ce constructeur est créé par défaut par le compilateur ...)
Donc, une seule solution: écrire un constructeur par copie.
exemple:
class class1
{
// mettre en privée les constructeurs par defaut
// est une bonne idee !
class1();
public:
// constructeur par copie
class1(const class1& c) {
cout << "class1 : constructeur par copie=> alloue :" << c.get_arraySize() << endl;
Je me demande comment ton code à pu être compilé...
Enfin j'ai repris ton code et l'es modifié pour qu'il respecte ce que tu voulais!
#include <iostream>
#include <vector>
using namespace std;
class class1 {
protected:
int* arrayInt; // tableau d'entier
public:
// J'ai mis une valeur par défaut, pour que tu puisses avoir un contructeur par défaut à cause de vector<class1> sinon tu ne peux utiliser que vector<class1*> (et bonjour les allocations dynamiques)
class1(unsigned int pSize=1) {
if(pSize <= 0)
arrayInt = NULL; // On sait jamais...
else
arrayInt = new int[pSize]; // C mieu, non?
}
~class1() {
if(arrayInt) // test du pointeur
delete []arrayInt; // après un new toujours un delete!
}
};
void main(void) {
int class1Nb = 10;
unsigned int arraySize = 50;
vector<class1> *vecClass1; // Je suis parti de cette base ... j'espère que c'est ça que tu veux allouer!
// Création
vecClass1 = new vector<class1>(class1Nb); // Container de 10 class1
for(int i=0;i<class1Nb;i++)
vecClass1->push_back(class1(arraySize)); // Ajout d'un élément dans ton vecteur
// les éléments de vector n'étant pas allouer ils seront détruits correctement lors de l'appel du destructeur de ton vector
// Destruction du vector
delete vecClass1; // la seule instance que tu es réalisées dans le main
}
Enfin dernière petite info, la classe vector peut contenir plus que la taille spécifier lors de la construction, ces éléments supplémentaires sont gérer dynamiquement!
Il faut savoir que dans la STL il existe plusieur type de liste à toi de bien les choisir en fonction de tes besoins car si l'interface te permettra d'en faire ce que tu veux, les performances elles agissent en fonction du type de al liste que tu as créée.
Bien je crois que le problèmes est résolu, tu ne devrai plus avoir de problème avec ton pointeur, en tout cas moa j'en ai pas trouvé lol