您的位置:首页 > 其它

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

2010-05-15 14:40 316 查看
一般情况来说 在类中 系统会自动提供一个默认的拷贝构造函数来处理复制,但在某写状况下,类体内的成员是需要动态开辟堆内存的,如果我们不自定义拷贝构造函数而让系统自己处理,那么就会导致堆内存的所属权产生混乱,已经开辟的一端堆地址原来是属于对象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



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 ;
}


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

这样改 就可以了

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));

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: