0

私は C++ で STL を使用してツリーの BFS のコードを練習していましたが、デバッグできないランタイム エラーが 1 つ発生しましたprintout() function。私はSTLが初めてなので助けてください..

#include<iostream>
#include<malloc.h> //on llvm we don't need this
#include<list>
using namespace std;
typedef struct Node{
int val;
struct Node* left;
struct Node* right;
}node;
void push(node** root,int val)
{
    if(!(*root))
    {
        node* temp=(node*)malloc(sizeof(node));
        temp->val=val;
        temp->right=temp->left=NULL;
        *root=temp;
    }
    else if(val<(*root)->val)
        push(&((*root)->left),val);
    else
        push(&((*root)->right),val);
}

void printout(node* head)
{
    node* temp;
    temp=head;
    list<node*>qu;

    //using bfs here
    while(temp!=NULL)
    {
        cout<<temp->val<<endl;
        if(temp->left!=NULL)
            qu.push_back(temp->left);
        if(temp->right!=NULL)
            qu.push_back(temp->right);
        temp=qu.front();
        qu.pop_front();
        //free(temp);
    }
}

int main()
{
node* root=NULL;
push(&root,3);
push(&root,4);
push(&root,1);
push(&root,10);
push(&root,2);
printout(root);
}

正しい出力を出力していますが、実行時間はあります

3
1
4
2
10
a.out(613) malloc: *** error for object 0x7fff55ed8bc8: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
4

2 に答える 2

1

が空qu.front()かどうかを確認せずに、各反復で呼び出しています。quそれが空の場合 - そして最終的にはそうなる - コードが壊れます。

qu最も簡単な解決策は、が空かどうかを確認することです。

if (qu.empty()) {
    temp = NULL;
} else {
    temp=qu.front();
    qu.pop_front();
    //free(temp);
}

しかし、それは奇妙に見えます。ループを完全に変更して、ループ!qu.empty()の条件として使用しwhileます。

list<node*> qu;
qu.push_back(head);
while(!qu.empty()) {
    node* temp = qu.front();
    qu.pop_front();
    if(temp->left)
        qu.push_back(temp->left);
    if(temp->right)
        qu.push_back(temp->right);
    //free(temp);
}
于 2013-10-05T08:27:42.720 に答える
1

何が起こるかというと、ツリーの最後の「葉」に到達すると、temp->leftとのtemp->right両方NULLであり、空の qu リストが得られます。呼び出すqu.front()と、空のリストで未定義の動作が発生します: http://en.cppreference.com/w/cpp/container/list/front

フロントに電話する前にサイズチェックを追加できます。

于 2013-10-05T08:27:53.857 に答える