引用(别名)是怎么回事,这里不赘述。引用变量初始化后就不能再修改,有一天遇到个有意思的问题,大致如下:
class A
{
public:
A(){ m_AID = 0; }
virtual ~A(){}
int m_AID;
};
class B : public A
{
public:
B() : A(), m_BID(m_AID){}
virtual ~B(){}
int& m_BID;
};
int _tmain(int argc, _TCHAR* argv[])
{
B* pB1 = new B;
pB1->m_BID = 1;
B* pB2 = new B;
memcpy(pB2, pB1, sizeof(B));
pB1->m_AID = 3;
printf("%d,%d\n", pB1->m_BID, pB2->m_BID);
return 0;
}
输出结果:
3,3
这里类B的成员m_BID是基类成员m_AID的引用(别名),进行内存拷贝的时候,变量pB2->m_BID引用的地址没有变,仍然指向pB1->m_AID,所以修改 pB1->m_AID,导致 pB2->m_BID 的值也变化了,pB2->m_AID与pB2->m_BID的值不一致。
CArray这个类,自动增长的时候,会重新分配空间,这个时候移动已有元素使用的就是内存拷贝,会有上面的问题,而且问题更甚,因为旧的内存被释放了,引用成员指向的是已被释放的内存。