队列模板出队列指针的问题

using namespace std;
template<class T>
class Queue {
public:Queue(int size=0);
      Queue(const Queue<T>& q);
      virtual~Queue();
      void In(T n);
      const T Out();
      bool Empty()const;
      bool Full()const;
private:int max; T* Front, * Tail;
};
template<class T>
Queue<T>::Queue(int size)
{
    Front=Tail = new T[(max = size)+1];
}
template<class T>
Queue<T>::Queue(const Queue<T>& q)
{
    Front = new T[(max = q.max)+1];
    Tail = Front + (int(q.Tail - q.Front));
    for (int i = 0; i < int(Tail - Front); i++)
    {
        Front[i] = q.Front[i];
    }
}
template<class T>
Queue<T>::~Queue()
{
    delete[]Front;
}
template<class T>
const T Queue<T>::Out()
{
    if (Tail == Front)
    {
        cout << "overflow" << endl;
        return -1;
    }
    else
    {
        return *(Front++);                        //返回出队的该元素
    }
}
template<class T>
void Queue<T>::In(T n)
{
    if (int(Tail - Front) >= max)
        cout << "overflow" << endl;
    else *(Tail++) = n;
}
template<class T>
bool Queue<T>::Empty()const
{
    return Front == Tail;
}
template<class T>
bool Queue<T>::Full()const
{
    return int(Tail - Front) == max;
}
int main()
{
    Queue<int>Queue1(10); Queue<double>Queue2(10);
    for (int i = 2; i < 5; i++)
        Queue1.In(i);
    for (double i = 0; i < 8; i++)
        Queue2.In(i);
    cout << Queue1.Out();  //这里出现问题

}

在执行Out操作的时候,release能编译通过,但是debug就是显示
图片说明
如果完美解决的话可以微信支付10y

你这个程序既然是指定大小的循环队列,那么头和尾指针应该和队列本身的动态分配地址分开,不然导致你出队后,队列指针变化,无法正确释放分配的空间。

#include <iostream>
using namespace std;
template<class T>
class Queue {
public:Queue(int size = 0);
       Queue(const Queue<T>& q);
       virtual~Queue();
       void In(T n);
       const T Out();
       bool Empty()const;
       bool Full()const;
private:int max; T* Front, *Tail, *Qdata;
};
template<class T>
Queue<T>::Queue(int size)
{
    Qdata = new T[size];
    Front = Tail = Qdata;
    max = size;
}
template<class T>
Queue<T>::Queue(const Queue<T>& q)
{
    Front = new T[(max = q.max) + 1];
    Tail = Front + (int(q.Tail - q.Front));
    for (int i = 0; i < int(Tail - Front); i++)
    {
        Front[i] = q.Front[i];
    }
}
template<class T>
Queue<T>::~Queue()
{
    delete[]Qdata;
}
template<class T>
const T Queue<T>::Out()
{
    if (Tail == Front)
    {
        cout << "overflow" << endl;
        return -1;
    }
    else
    {
        return *(Front++);                        //返回出队的该元素
    }
}
template<class T>
void Queue<T>::In(T n)
{
    if (int(Tail - Front) >= max)
        cout << "overflow" << endl;
    else *(Tail++) = n;
}
template<class T>
bool Queue<T>::Empty()const
{
    return Front == Tail;
}
template<class T>
bool Queue<T>::Full()const
{
    return int(Tail - Front) == max;
}
int main()
{
    Queue<int>Queue1(10); Queue<double>Queue2(10);
    for (int i = 2; i < 5; i++)
        Queue1.In(i);
    for (double i = 0; i < 8; i++)
        Queue2.In(i);
    cout << Queue1.Out();  //这里出现问题

}