我这里有个误会。我正在设计一个使用Client类作为基本单元的Queue类。列表结构由指向下一个数据的指针和用于保存 Client 对象的变量组成。
Queue 类有 2 种操作方式。它的操作方式由bool MODE变量决定。如果 mode 等于 1,则 Queue 类使用放置 new 运算符,如果不是,则使用 new 运算符。
这是 Queue 类的原型:
class Queue
{
private:
const int max_lists;
int no_lists, counter;
char client_value;
list *chunk;
list *top;
const bool MODE;
void addFirst(const Client &c);
void addLast(const Client &c);
void deleteLast();
void deleteFirst();
void clean_mem();
void clean_mem(list *&pos);
list* malloc();//T* type
public:
Queue();
Queue(list *buffer,int no);
Queue(const Queue &q);
Queue& operator=(const Queue &q);
~Queue() { clean_mem(); }
void enqueue(const Client &c);
void timeoutCustomers();
void decreaseTimeout();
Client getCustomer() const;
void finishCustomer();
void show() const;
};
导致给出错误的函数定义在这里:
void Queue::addFirst(const Client &c)
{
if(top==nullptr)
{
top = malloc();
top->info = c;
top->next = nullptr;
}
else
{
list *add = malloc();
add->info = c;
add->next = top;
top = add;
}
}
list* Queue::malloc()
{
if(MODE)
{
if(no_lists==max_lists)
{
return nullptr;
}
else
{
list *tmp = chunk;
counter = 0;
while(counter++<max_lists)
{
client_value = (char)tmp->info;
if(client_value==-1 && tmp->next==nullptr)
{
return new(tmp) list;
}
tmp++;
}
return nullptr;
}
}
else
{
return new list;
}
}
这是列表结构:
struct list { Client info; list *next; };
当我创建 Queue 类的实例时,我可以选择是继续放置 new 还是只使用 new 运算符。
如果我选择新的展示位置,我必须发送列表类型数组的地址。地址被保存到块指针中。顶部指针保存链表的首地址。然后,如果我调用 addFirst() 函数,它会在 top->info = c 处停止。错误指向 top->info :
CXX0030: Error: Expression cannot be evaluated.
但是当我切换回新的运营商时,一切正常。这告诉我在已分配的内存中分配新部分存在问题。
有人可以告诉我这里有什么问题吗?