2016-04-18 14 views
0

Ich bin ziemlich neu in der Programmierung und habe Speicherprobleme mit meinem Programm. Irgendwo übernehme ich zu viel Speicher, kann aber die Quelle nicht finden. Ich verstehe nicht, warum es Probleme mit der malloc-Zuweisung gibt, da ich keine Variablen dynamisch zuweise. DankeC++ malloc() Speicherbeschädigung (schnell)

//returns the index of the character in the string 
int find(string line, int begin, int end, char character) { 
    for (int i = begin; i <= end; i++) { 
     if (line[i] == character) { 
      return i; 
     } 
    } 

    //return -1 if not found 
    return -1; 
} 

//Get the characters from levelorder that align with inorder 
char* getCharacters(char inOrder[], char levelOrder[], int a, int b) { 
    char *newLevelOrder = new char[a]; 
    int j = 0; 
    for (int i = 0; i <= b; i++) 
     if (find(inOrder, 0, a-1, levelOrder[i]) != -1) 
      newLevelOrder[j] = levelOrder[i], j++; 
    return newLevelOrder; 
} 

//creates a new Node given a character 
Node* newNode(char character) { 
    Node *node = new Node; 
    node->character = character; 
    node->left = NULL; 
    node->right = NULL; 
    return node; 
} 

//creates the huffman tree from inorder and levelorder 
Node* createInLevelTree(char inOrder[], char levelOrder[], int beginning, int end, int size) { 
    //if start index is out of range 
    if (beginning > end) { 
     return NULL; 
    } 

    //the head of the tree is the 1st item in level order's traversal 
    Node *head = newNode(levelOrder[0]); 

    //if there are no children we can't go farther down 
    if (beginning == end) { 
     return head; 
    } 

    //get the index of the node 
    int index = find(inOrder, beginning, end, head->character); 

    //get the subtree on the left 
    char *leftTree = getCharacters(inOrder, levelOrder, index, size); 

    //get the subtree on the right 
    char *rightTree = getCharacters(inOrder + index + 1, levelOrder, size-index-1, size); 

    //branch off to the left and right 
    head->left = createInLevelTree(inOrder, leftTree, beginning, index-1, size); 
    head->right = createInLevelTree(inOrder, rightTree, index+1, end, size); 

    //delete 
    delete [] leftTree; 
    delete [] rightTree; 

    return head; 
} 

Mit dieser Linie behoben. Danke Sam. Char * neue Ebene order = new char [b]

+2

Dies ist ein typisches Ergebnis von unsicheren Programmierpraktiken. getCharacters() weist ein Array mit der Länge "a" zu, aber der folgende Code kann anscheinend so viele wie "b" Zeichen in das neue Array eingefügt werden. Eine Überprüfung, dass "b" nicht "a" überschreitet, ist jedoch nicht in Sicht. Wer weiß. Vielleicht ist es weniger, vielleicht ist es mehr, wir drücken nur die Daumen und hoffen, dass wir genügend Speicher zugewiesen haben. –

+0

Welche Speicherprobleme haben Sie? – user1354033

+7

"Ich bin nicht dynamisch zuzuweisen" ist eine fett formatierte Anweisung für ein Programm, das sowohl 'new char [a]' als auch 'new Node' enthält. – molbdnilo

Antwort

0

Irgendwo habe ich Speicher bin überbeanspruchend, aber die Quelle nicht finden kann.

Ich würde vorschlagen, dass Sie zumindest Ihre Zeichen-Arrays mit std::vector<char> oder std::string ersetzen und einige Größe Behauptungen setzen, oder die an Mitglied verwenden nicht zu sehen, über Indizierung geschieht. Darüber hinaus wird die Verwendung von operator new mehr als wahrscheinlich in Bezug auf malloc implementiert, und Betreiber löschen in Bezug auf freie. Daher werden Sie dynamisch zugeordnet.

Auch Wiki für RAII. Versuchen und verwenden Sie RAII für dynamisch zugewiesenen Speicher ... immer. Std :: Vektor und Std :: String gibt Ihnen das kostenlos.

auch den Code betrachten unten:

char* getCharacters(char inOrder[], char levelOrder[], int a, int b) { 
    char *newLevelOrder = new char[a]; 
    int j = 0; 
    for (int i = 0; i <= b; i++) 
     if (find(inOrder, 0, a-1, levelOrder[i]) != -1) 
      newLevelOrder[j] = levelOrder[i], j++; 
    return newLevelOrder; 
} 

das Lesen, bin ich der Menge von b nicht sicher. Es gibt keine Einschränkung bei der Sichtverbindung. Woher weiß ich, dass die for-Schleife kein indefiniertes Verhalten (durch Überindizierung) auslöst? Normalerweise würde eine korrekte for-Schleife hier "a" verwenden, da "a" verwendet wurde, um das Array zu erstellen ... Wenn Sie so codieren möchten, verwenden Sie großzügig, da Sie Annahmen über den aufrufenden Code treffen (aber nur verwenden ein Vektor ....).

char *newLevelOrder = new char[a]; 
    int j = 0; 

    for (int i = 0; (i < a) && (i <= b); i++) 
    { 

oder

assert (b < a); 
    char *newLevelOrder = new char[a]; 
    int j = 0; 

    for (int i = 0; (i <= b); i++) 
    { 

Ich lasse die Aufgabe, für die Sie Ihre Arrays mit Vektoren und String als eine Übung zu ersetzen, sowie großzügig behauptet Spritzen in for-Schleifen erwähnt ... Das wird wahrscheinlich lösen Ihre Probleme