读书人

关于CArray的一个有关问题

发布时间: 2012-12-15 15:16:03 作者: rapoo

关于CArray的一个问题
我定义了一个类:


class CIndicator
{
public:
CIndicator(void);
CIndicator(CIndicator& Indicator);//之后添加的
~CIndicator(void);
CIndicator& operator = (CIndicator& Indicator);//之后添加的
//数据成员
CString m_strCodeNumber;
CString m_strCodeName;
CStockMem* m_pMem;
};



CIndicator::CIndicator(void)
{
m_pMem = new CStockMem;
m_strCodeNumber = "";
m_strCodeName = "";
}

CIndicator::CIndicator(CIndicator& Indicator)
{
m_pMem = new CStockMem;
m_strCodeNumber = Indicator.m_strCodeNumber;
m_strCodeName = Indicator.m_strCodeName;
}

CIndicator::~CIndicator(void)
{
delete m_pMem;
}

CIndicator& CIndicator::operator = (CIndicator& Indicator)
{
m_strCodeName = Indicator.m_strCodeName;
m_strCodeNumber = Indicator.m_strCodeNumber;

return *this;
}



在使用时发现如果没有之后添加的重载带参数的构造函数和=操作符,在使用(CArray<CIndicator, CIndicator>& 类型的对象ReferenceArray的Add方法时(此时ReferenceArray的大小为0),就会出现异常.原因出在了析构函数会多次delete m_pMem;但是加上了那两个函数之后,就没有问题了,菜鸟求解原因!
我单步跟踪了一下,发现其中多次调用了CIndicator的构造和析构函数,但是具体是什么情况却不能理解。
[最优解释]
参阅 http://www.cnblogs.com/BlueTzar/articles/1223313.html


[其他解释]
最后搞明白了,因为放在CArray里面的东西必须是可以复制的。而CIndicator里面有一个指针,如果是不重载操作符和构造函数,则会在赋值和复制的时使用默认的赋值和复制功能——让两个指针指向同一个地址,在CArray的内部,调用类的构造和析构函数时,就有可能出错,比如将一个内存delete两次(因为两个指针指向同一地址),所以,在这里重载了赋值和复制操作符,让它变为深拷贝。就不会出错了,类似的问题在stl库里也会出现。

读书人网 >VC/MFC

热点推荐