以下是我正在分析的一大块代码。由于我是初学者C ++程序员,我不明白为什么所有者的代码将 node-point 类型的变量声明为 node * p = new node ,而不仅仅是声明它为 node * p 。在我看来,两种方法都会产生相同的行为。我错了吗?如果是这样,为什么?
class Queue {
private:
node *front;
node *rear;
public:
Queue();
~Queue();
bool isEmpty();
void enqueue(int);
int dequeue();
void display();
};
void Queue::display(){
node *p = new node;
p = front;
if(front == NULL){
cout<<"\nNothing to Display\n";
}else{
while(p!=NULL){
cout<<endl<<p->info;
p = p->next;
}
cout << endl;
}
}
感谢。
EDITED 现在,我还有其他问题。下面的代码是Queue类的析构函数,正如我们所看到的,所有者的代码决定在类型指针节点的变量 front 上使用运算符 delete 。根据我所做的读数,运算符 delete 应该与operator new配对使用,或者换句话说,只需要释放由程序员直接分配的内存(delete)(新)。那么,为什么所有者的代码使用删除。这是另一个错误吗?
Queue::~Queue() {
delete front;
}
答案 0 :(得分:3)
假设构造node
的默认没有副作用,无论你写node *p
还是node *p = new node
,程序的行为都是一样的,因为p
是在下一行重新分配。
但是,由于new node
创建的对象永远不会被删除,因此Queue::display
每次调用时都会泄漏内存。您好像在代码中发现了一个错误。可以通过删除new node
并将p
初始化为front
来修复,因为我怀疑作者并不知道他在做什么。
node *p = front;