我有以下课程:
class list {
private:
struct node {
node() { data=T(); prev=next=this; }
˜node() {}
T data;
node *prev;
node *next;
};
public:
class iterator {
public:
iterator() : p(NULL) {}
T & operator*() { return p->data; }
iterator & operator++()
{ p = p->next; return *this; }
iterator & operator++(int)
{ iterator tmp = *this; ++*this; return *tmp; }
bool operator==(const iterator & rhs) const
{ return p == rhs.p; }
bool operator!=(const iterator & rhs) const
{ return p != rhs.p; }
private:
friend class list<T>;
iterator(node *p) : p(p) {}
node *p;
};
iterator begin() { return iterator(head->next); }
iterator end() { return iterator(head); }
list();
˜list();
etc ...
private:
int N;
node *head;
node *findnode(int);
};
我看到begin()函数返回迭代器类的构造函数。这是否意味着在调用它时会创建一个新的迭代器?如果是这样,在分配此迭代器的变量超出范围后,是否会回收内存?我有点困惑,因为迭代器构造函数没有返回类型。如果有人能够对我的问题有所了解,我将非常感激。
答案 0 :(得分:8)
是的,在调用begin时会创建一个新的迭代器。在较高的层次上,是的,迭代器占用的内存在超出范围后将被回收。
构造函数没有返回类型,因为它们在要初始化的内存中被调用。
在较低级别,在堆栈上声明的变量在超出范围时会调用它们的析构函数,这是“回收”的一个方面。它们占用的内存位于堆栈而不是堆中(就像调用new时一样),因此在执行删除或垃圾回收时不会释放它。相反,变量占用的内存可能闲置一段时间或被立即覆盖,具体取决于堆栈帧是否被移除或在超出范围后立即添加(即函数正在返回堆栈或正在进行新调用)