【求教】关于vector的迭代器解决方案

【求教】关于vector的迭代器
我写了一个二叉树分层遍历的程序,在用到迭代器的情况下报错,试了几种方法都不行,按照C++ primer和c++程序设计语言上的规定来说是对的呀,求大大们不吝赐教,上代码:

void PrintNodeByLevel2(Node *root)
{
vector<Node *> nodeVec;
nodeVec.push_back(root);
vector<Node *> ::iterator m_current=nodeVec.begin();
vector<Node *>::iterator m_last=nodeVec.end();
while(static_cast<unsigned>(m_current-nodeVec.begin())<nodeVec.size())
{
m_last=nodeVec.end();
while(m_current<m_last)
{
cout<<(*m_current)->data<<" ";
if((*m_current)->lchild)
nodeVec.push_back((**m_current).lchild);
if((*m_current)->rchild)
nodeVec.push_back((**m_current).rchild);
m_current++;
}
cout<<endl;
}
}

报的错如下
【求教】关于vector的迭代器解决方案

而我用下标访问却没问题:

void PrintNodeByLevel3(Node *root)
{
vector<Node *> nodeVec;
nodeVec.push_back(root);
int m_current=0;
int m_last=1;
while(static_cast<unsigned>(m_current)<nodeVec.size())
{
m_last=nodeVec.size();
while(m_current<m_last)
{
cout<<(nodeVec[m_current])->data<<" ";
if((nodeVec[m_current])->lchild)
nodeVec.push_back((nodeVec[m_current])->lchild);
if((nodeVec[m_current])->rchild)
nodeVec.push_back((nodeVec[m_current])->rchild);
m_current++;
}
cout<<endl;
}
}

第二段代码可以正确输出
【求教】关于vector的迭代器解决方案

------解决方案--------------------
你看了stl的push_back的源代码就会了解.
当push_back第一个元素(vector中为空)时,分配一个空间,然后拷贝push_back进来元素.
当push_back第二个元素时,首先分配两个空间然后,将原来第一个元素拷贝过来,再将新push_back的元素拷贝进来,最后析构原来的第一个元素的空间.
当push_back第三个元素....依次类推.

从你的代码看,执行到这的时候,push_back了第二元素.
if((*m_current)->lchild)
                nodeVec.push_back((**m_current).lchild);

依据上面的规则,m_current所指向的那个内存空间已经被析构了,你依然用原来的m_current所指向的那个内存地址去访问,肯定会崩溃的.