运算符重载中可能的深拷贝问题
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
在
中 m_pData = other.m_pData ;
这样复制的话 肯定就是深拷贝了,一旦临时变量析构 后面的变量再析构的话 就是严重的错误。
这样改 就可以了
更详细的说明 在这个地址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)); }
相关文章推荐
- 拷贝构造和运算符重载(我解决的问题)
- 使用深拷贝解决指针悬挂问题(“=”运算符重载)
- openstack多个外部网络可能引发的网络问题
- Oracle安全 - SCN的可能最大值与耗尽问题
- C#中关于:“找不到请求的 .Net Framework Data Provider。可能没有安装。”问题
- SSH无密码验证可能出现的问题
- PDO在连接数据库时所可能遇到的问题
- java面试中可能常问的几个技术问题及答案
- 远程桌面不能拷贝文件的问题
- 软件开发面试可能出现的问题
- 测试管理中可能存在的问题及分析
- 继承ccsprite后可能出现的问题
- [置顶]Win2012R2的一个Bug安装群集后可能引发的软件崩溃问题及相应补丁
- 第一个servlet小程序可能遇到的问题
- 翻译《有关编程、重构及其他的终极问题?》——20.光对文件做EOF检查可能还不够
- Hibernate分页可能引起的性能问题
- 【C++】构造拷贝构造的N中调用情况的问题
- (转)水平分库分表的关键步骤以及可能遇到的问题
- 关于Selenuim Webdriver查找可能不存在的页面元素的问题
- 机器学习问题的可解性的变化,不可能的事情正在慢慢变成现实