为什么free了这个队列以后判断他还是不为空

#include <iostream>
#define maxsize 5
typedef int ElemType;

typedef struct//定义循环队列
{
    ElemType data[maxsize];
    int head;//队首
    int rear;//队尾
}SqQueue;

void InQueue(SqQueue *&Q)//初始化循环队列
{
    Q=(SqQueue *)malloc(sizeof(SqQueue));//获取空间
    Q->head=Q->rear=0;//首尾为0
}

void DestoryQueue(SqQueue *&Q)
{
    free(Q);
}

bool QueueEmpty(SqQueue *Q)//判断循环队列是否为空
{
    if(Q->head==Q->rear)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

bool QueueFull(SqQueue *Q)//判断循环队列是否满
{
    if(Q->head==(Q->rear+1)%maxsize)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

bool EnQueue(SqQueue *&Q,ElemType e)//入队
{
    if(Q->head==(Q->rear+1)%maxsize)//判断是否队满
    {
        return 0;
    }
    else
    {
        Q->data[Q->rear]=e;
        Q->rear=(Q->rear+1)%maxsize;//将队首移到下一位,或循环到第0位,当rear+1==maxsize的时候通过模运算会到第0位
    }
}

bool DeQueue(SqQueue *&Q,ElemType &e)//出队
{
    if(Q->head==Q->rear)//判断是否队空
    {
        return 0;
    }
    else
    {
        e=Q->data[Q->head];
        Q->head=(Q->head+1)%maxsize;//将队首移到下一位,或循环到第0位,当head+1==maxsize的时候通过模运算会到第0位
        return 1;
    }
}

bool GetQueue(SqQueue *&Q,ElemType &e)
{
    if(Q->head==Q->rear)//判断是否队空
    {
        return 0;
    }
    else
    {
        e=Q->data[Q->head];
        return 1;
    }
}

int main()
{
    SqQueue *Q;
    InQueue(Q);
    ElemType e;
    printf("初始化一个有五个空位的循环队列\n");
    printf("将12345按顺序放入队列中\n");
    EnQueue(Q,1);
    EnQueue(Q,2);
    EnQueue(Q,3);
    EnQueue(Q,4);
    EnQueue(Q,5);
    printf("判断队是否为空:%d\n",QueueEmpty(Q));
    printf("判断队是否为满:%d\n",QueueFull(Q));
    printf("出队\n");
    DeQueue(Q,e);
    printf("出队元素为%d\n",e);
    printf("取队首元素\n");
    GetQueue(Q,e);
    printf("队首元素为%d\n",e);
    printf("摧毁队列\n");
    printf("判断队是否为空:%d\n",QueueEmpty(Q));
}

 

没见你销毁队列啊,DestoryQueue函数你也每调用,你如果调用了DestoryQueue,你最后printf("判断队是否为空:%d\n",QueueEmpty(Q));这里会崩的。