2009-11-22 4 views
0

Cette question est en C++. J'essaie d'allouer dynamiquement un tableau de pointeurs aux objets. Je sais que je peux utiliser un conteneur vectoriel mais le but de l'exercice est de ne pas ...Allocation dynamique d'un tableau de pointeurs à des objets

Voici le code:

void HealthClub::AddHealthClubDevice (char* HealthClubDeviceName) 
{          //We added NumberOfDevices as an attribute, so we won't have to use sizeof all the time 
    if (NumberOfDevices==0) // This is for the first device we want to add 
    { 
     HealthClubDevices = new Device*[1]; 
     HealthClubDevices[0]= new Device(HealthClubDeviceName); 
     NumberOfDevices++; 
    } 
    else  // Here we did realloc manually... 
    { 
     Device** tempHealthClubDevices; 
     tempHealthClubDevices = new Device*[++NumberOfDevices]; //this is where we see the first sign of a problem, The tempHealthClubDevices is not allocated properly 

     for (int i=0 ; i<(NumberOfDevices-1) ; i++) 
     tempHealthClubDevices[i]=HealthClubDevices[i]; 
     delete[] HealthClubDevices;   
     HealthClubDevices = tempHealthClubDevices; 
     HealthClubDevices[NumberOfDevices-1]= new Device(HealthClubDeviceName); 
    } 
} 

Le dispositif objets ** ne sont pas attribués correctement, ils ne grandissent jamais en taille, ils sont toujours un élément. Est-ce que quelqu'un sait pourquoi? Merci!

+0

Est-ce que ce problème se produit à chaque fois? Est-il possible que le nouvel opérateur ne puisse pas allouer assez de mémoire? – computergeek6

+0

Cela arrive chaque fois que ce n'est définitivement pas un problème de mémoire. – wazuba

+0

Je ne vois rien de mal avec le code que vous avez posté. Bien que votre commentaire qui dit "a ajouté NumberOfDevices comme attribut, donc nous n'aurons pas à utiliser sizeof tout le temps" est dérangeant. L'opérateur sizeof ne vous donnera pas le nombre de périphériques que vous avez alloués. –

Répondre

4

Impossible de reproduire votre problème. Plus précisément, voici tout le code de squelette que je compilé et exécuté avec succès - votre méthode ainsi que l'échafaudage minimum pour en faire un programme complet:

#include <iostream> 

struct Device { 
    char* name; 
    Device(char* n) {name = n;} 
}; 

struct HealthClub { 
    int NumberOfDevices; 
    Device** HealthClubDevices; 
    HealthClub() { NumberOfDevices = 0;} 
    void AddHealthClubDevice(char *); 
}; 

std::ostream& operator<<(std::ostream& o, const HealthClub& h) { 
    o << h.NumberOfDevices << " devices:" << std::endl; 
    for(int i=0; i<h.NumberOfDevices; ++i) { 
    o << " " << h.HealthClubDevices[i]->name << std::endl; 
    } 
    o << "That's all!\n" << std::endl; 
    return o; 
} 

void HealthClub::AddHealthClubDevice (char* HealthClubDeviceName) 
{          //We added NumberOfDevices as an attribute, so we won't have to use sizeof all the time 
    if (NumberOfDevices==0) // This is for the first device we want to add 
    { 
     HealthClubDevices = new Device*[1]; 
     HealthClubDevices[0]= new Device(HealthClubDeviceName); 
     NumberOfDevices++; 
    } 
    else  // Here we did realloc manually... 
    { 
     Device** tempHealthClubDevices; 
     tempHealthClubDevices = new Device*[++NumberOfDevices]; //this is where we see the first sign of a problem, The tempHealthClubDevices is not allocated properly 

     for (int i=0 ; i<(NumberOfDevices-1) ; i++) 
     tempHealthClubDevices[i]=HealthClubDevices[i]; 
     delete[] HealthClubDevices;   
     HealthClubDevices = tempHealthClubDevices; 
     HealthClubDevices[NumberOfDevices-1]= new Device(HealthClubDeviceName); 
    } 
} 

int main() { 
    HealthClub h; 
    std::cout << h; 
    h.AddHealthClubDevice("first"); 
    std::cout << h; 
    h.AddHealthClubDevice("second"); 
    std::cout << h; 
    h.AddHealthClubDevice("third"); 
    std::cout << h; 
    return 0; 
} 

Compile bien, même avec --pedantic, et lors de son exécution émet:

$ ./a.out 
0 devices: 
That's all! 

1 devices: 
    first 
That's all! 

2 devices: 
    first 
    second 
That's all! 

3 devices: 
    first 
    second 
    third 
That's all! 

comme souhaité. Donc, la cause de votre problème doit être ailleurs. Étant donné que votre programme réel échoue (vous ne nous montrez pas exactement comment) et que celui-ci minimal réussit, vous pouvez "interpoler par bissection" pour construire le cas d'échec minimal - si cela ne vous montre toujours pas où se situe le problème , en affichant le cas d'échec minimal et l'un epsilon plus petit que celui qui réussit toujours en tant que question SO peut sûrement vous obtenir l'aide dont vous avez besoin (assurez-vous de spécifier également le compilateur, le système d'exploitation, etc.).

+0

Merci beaucoup! Mon problème était avec l'affichage du tableau ... wow! – wazuba

Questions connexes