2010-10-11 7 views
0

J'ai un tableau de pointeurs d'objets CName. J'ai le constructeur suivant qui initialise mon tableau à la taille un. Puis, quand j'ajoute un objet, je développe le tableau de 1 et ajoute le nouvel objet. Il compile bien, mais quand j'essaie de les imprimer, je reçois juste une erreur de segmentation. Pouvez-vous regarder et voir si je fais quelque chose de mal?Création dynamique d'un tableau en C++

//constructor 
Names_Book::Names_Book() 
{ 
    grow_factor = 1; 
    size = 0; 
    cNames = (CName**)malloc(grow_factor * sizeof(CName*)); 
    cNames[0] = NULL; 
} 

void Names_Book::addCName(CName* cn) 
{ 
    int oldSize = size; 
    int newSize = size + 1; 

    CName** newCNames = (CName**)malloc(newSize * sizeof(CName*)); 

    for(int i=0; i<newSize; i++) 
    { 
     newCNames[i] = cNames[i]; 
    } 

    for(int i=oldSize; i<newSize; i++) 
    { 
     newCNames[i] = NULL; 


    } 
    /* copy current array to old array */ 
    cNames = newCNames; 

    delete(newCNames); 

    size++; 

} 
+4

Vous devez utiliser un vecteur. – JoshD

+3

Vous mélangez 'malloc()' et 'delete' en C++? –

+2

Ce n'est pas C++, c'est mauvais; Pardon. :/Vous devriez obtenir [un livre] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) et apprendre le bon C++. – GManNickG

Répondre

6

Pour avoir dynamiquement gamme Growable en C++, vous devrait utiliser std::vector ou au moins regarder sa mise en œuvre.

3

Il y a quelques choses de mal à cette fonction:

void Names_Book::addCName(CName* cn) 
{ 
    int oldSize = size; 
    int newSize = size + 1; 

    CName** newCNames = (CName**)malloc(newSize * sizeof(CName*)); 

    for(int i=0; i<newSize; i++) 
    { 
     newCNames[i] = cNames[ 
    } 

    for(int i=oldSize; i<newSize; i++) 
    { 
     newCNames[i] = NULL; 


    } 
    /* copy current array to old array */ 
    cNames = newCNames; //right here you just leaked the memory cNames was pointing to. 

    delete(newCNames); // right here you delete the new array you just created using the wrong call. 

    size++; 

} 

Près de la fin que vous faites deux choses tout à fait tort. (Ci-dessus Commentés.)

Ces deux dernières lignes devraient être:

free(cNames); 
cNmaes = newCNames; 

En outre, vous devriez faire un des éléments realloc plutôt que de copier lentement un par un ....

Cela dit, vous devriez utiliser le vecteur. N'essayez pas de réécrire (faiblement) ce qui existe déjà.

+0

JoshD l'a frappé. La faute de seg se produit à cause de la suppression. Vous venez de vous débarrasser du tampon que vous avez attribué. Vous devez vous débarrasser de cNames, puis copier newCNames dans cNames pour éviter la fuite de mémoire. –

0

La première boucle doit être à oldSize:

for(int i=0; i<oldSize; i++) 

CNAMES est pas assez grand pour newSize.