2013-06-02 4 views
1

Так что у меня возникает раздражающая проблема segfault в этой функции, которая, как предполагается, увеличивает размер массива.C++, создающий новый массив, вызывающий 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++; 
} 

Когда я запускаю это в то время как с помощью GDB, он говорит мне, что мой выдаёт ошибку сегментации, вызвана этой линии:

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

Я думал, что это может быть проблема с калибровкой (# членов против буквальным размер в байтах), поэтому я пробовал:

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

Но это также вызывает segfault точно так же. Помогите?

Если это полезно: Вот определение для узла и аргумента

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

Какова ценность 'argc'? Можете ли вы построить [минимальный тестовый сценарий] (http://sscce.org)? –

+0

argc инициализируется равным 0 во всех конструкторах узла – nanoprogrammer

+1

Скомпилируйте с '-g' и опубликуйте значение argc (p argc) в точке, где он segfaults. Есть ли причина, по которой вы не используете std :: vector? – JRG

ответ

1

Учитывая, что «ARGC» является значением члена, то выдаст ошибка сегментация, вероятно, вызвана «это» быть неверным значением, вероятно, NULL. Вы можете проверить это, выполнив

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

Тогда посмотрите на значение «этого», когда эта линия ошибки сегментации.

Возможно, вы также можете скомпилировать с помощью «-Wall -Wextra -O0 -g», чтобы получить максимальную помощь по отладке из ваших инструментов.

+0

Хороший вызов, проблема заключалась в отсутствии конструктора копий для узла, поэтому, когда я добавьте узел в мой стек с помощью push_back(), argc был потерян, вызвав segfault, когда я попытался создать массив размером> 4 миллиарда: P (или -0249240356, что бы он ни выбрал) – nanoprogrammer

Смежные вопросы