关于模拟队列时数据丢失的问题

模拟队列的时候有时会出现数据丢失的情况
#include<iostream>
#include<vector>
using namespace std;
struct QUEUE {
    int* pBASE;
    int front;
    int rear;
};
int init(QUEUE*);//初始化队列
void inqueue(QUEUE*,int);//入队
void traverse(QUEUE*,int);//遍历
bool full(QUEUE*,int);//判断是否满
bool empty(QUEUE*);//判断是否空
int main() {
    QUEUE newQUEUE;
    int val = init(&newQUEUE);
    inqueue(&newQUEUE, val);
    inqueue(&newQUEUE, val);
    inqueue(&newQUEUE, val);
    inqueue(&newQUEUE, val);
    traverse(&newQUEUE,val);
    system("pause");
    return 0;
}
int init(QUEUE* pQUEUE) {
    int i;
    cout << "请输入数组长度" << endl;
    cin >> i;
    i += 1;
    vector<int>arr;
    arr.resize(i);
    QUEUE newQUEUE;
    pQUEUE->pBASE = &arr[0];
    pQUEUE->front = 0;
    pQUEUE->rear = 0;
    return i;
}//初始化队列
void inqueue(QUEUE* pQUEUE, int val) {
    int m = 0;
    if (full( pQUEUE,val)) {
        cout << "队列已满,无法添加" << endl;
    }
    else {
        cout << "请输入要添加的数据" << endl;
        cin >> m;
        pQUEUE->pBASE[pQUEUE->rear]=m;
        pQUEUE->rear = (pQUEUE->rear+1)%val;
        cout << pQUEUE->pBASE[pQUEUE->rear - 1] << endl;//在将此行注释掉时就会出现数据大量丢失,不注释掉的话数组第一个元素就会丢失
    }
}//入队
bool full(QUEUE* pQUEUE,int val) {
    if ((pQUEUE->rear + 1) % val == pQUEUE->front) {
        return true;
    }
    else
        return false;
}//判断是否满
bool empty(QUEUE* pQUEUE) {
    if (pQUEUE->front == pQUEUE->rear) {
        return false;
    }
    else
        return true;
}//判断是否空
void traverse(QUEUE* pQUEUE,int val) {
    int x;
    for (int x = 0; x < val-1; x++) {
        cout << pQUEUE->pBASE[x] << endl;
    }
}//遍历
想知道为什么会出现这种情况