运算符重载中可能的深拷贝问题

来源:互联网 发布:java调用webservice 编辑:程序博客网 时间:2024/04/30 06:12

一般情况来说 在类中 系统会自动提供一个默认的拷贝构造函数来处理复制,但在某写状况下,类体内的成员是需要动态开辟堆内存的,如果我们不自定义拷贝构造函数而让系统自己处理,那么就会导致堆内存的所属权产生混乱,已经开辟的一端堆地址原来是属于对象a的,由于复制过程发生,b对象取得是a已经开辟的堆地址,一旦程序产生析构,释放堆的时候,计算机是不可能清楚这段地址是真正属于谁的,当连续发生两次析构的时候就出现了运行错误。

更详细的说明 在这个地址http://pcedu.pconline.com.cn/empolder/gj/c/0503/570112_1.html

 

如同我发的帖子http://topic.csdn.net/u/20100514/17/aa2ea6c2-0fb8-4fc4-b467-d08f979fa5d4.html

[code=C/C++]

CMatrix& CMatrix::operator=(const CMatrix &other)
{
   
if (&other == this)
    {
       
return (*this) ;
    }
    m_NumColumns
= other.m_NumColumns ;
    m_NumRows
= other.m_NumRows ;
    m_pData
= other.m_pData ;
   
return *this ;
}

[/code]

中 m_pData = other.m_pData ;
这样复制的话 肯定就是深拷贝了,一旦临时变量析构   后面的变量再析构的话 就是严重的错误。

这样改 就可以了

[code=C/C++]

CMatrix::CMatrix(const CMatrix &other)
{

m_NumColumns = other.m_NumColumns;
m_NumRows = other.m_NumRows;
m_pData = new double[m_NumColumns * m_NumRows];
memcpy(m_pData,other.m_pData,m_NumColumns * m_NumRows *sizeof(double));


[/code]