2013-06-02 3 views
1

J'ai donc un problème de segfault ennuyeux dans cette fonction qui est censée augmenter la taille d'un tableau.C++ créer un nouveau tableau provoquant segfault

void Node::pushArg(Argument arg) 
{ 
    Argument * newlist = new Argument[argc+1]; 
    for (int i = 0; i < argc; i++) 
     newlist[i] = args[i]; 
    newlist[argc] = arg; 
    delete[] args; 
    args = newlist; 
    argc++; 
} 

Quand je lance ce tout en utilisant gdb, il me dit mon segfault est causée par cette ligne:

Argument * newlist = new Argument[argc+1]; 

Je pensais que ce serait peut-être un problème avec la taille (nombre de membres vs littéral taille en octets) donc j'ai essayé:

Argument * newlist = new Argument[sizeof(Argument)*(argc+1)] 

Mais cela provoque aussi une erreur de segmentation exactement de la même manière. Aidez-moi?

S'il est utile: Voici les définitions de nœud et Argument

class Argument 
{ 
public: 
    bool nested; // is the Argument a string, or a nested Node? 
    char * str_content; // string value 
    Node * nested_node; // Pointer to nested note 

    Argument(); // Null intializer 
    Argument(char *); // Create string node 
    Argument(Node *); // Create nested node 
    Argument(const Argument&); // Copy constructor 
}; 

class Node 
{ 
public: 
    char * head; // Head of list (function) 

    int argc; // # of arguments 
    Argument * args; 

    Node(); //intialize null 
    Node(char *); // intialize with head 

    void pushArg(Argument); // Add an argument to list 

    char * toString(); // the Node in String Format 
}; 
+5

Quelle est la valeur de 'argc'? Pouvez-vous construire un [test-case minimal] (http://sscce.org)? –

+0

argc est initialisé à 0 dans tous les constructeurs du noeud – nanoprogrammer

+1

Compilez avec '-g' et affichez la valeur de argc (p argc) au point où il se sépare. Y a-t-il une raison pour laquelle vous n'utilisez pas std :: vector? – JRG

Répondre

1

Étant donné que « argc » est une valeur de membre, la segfault est probablement causée par « ce » étant une valeur non valide, probablement NULL. Vous pouvez le vérifier en faisant

void Node::pushArg(Argument arg) 
{ 
    size_t numArgs = argc + 1; 

Ensuite, regardez la valeur de « ce » lorsque cette segfaults ligne.

Vous devriez probablement également compiler avec "-Wall -Wextra -O0 -g" pour obtenir une assistance maximale de débogage de vos outils.

+0

Bon appel, le problème était qu'il n'y avait pas de constructeur de copie pour Node, donc quand je ajouter un Node à ma pile en utilisant push_back(), argc a été perdu, provoquant un segfault quand j'ai essayé de créer un tableau d'une taille> 4 milliards: P (ou -0249240356 tout ce qu'il choisit) – nanoprogrammer

Questions connexes