免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: toniz
打印 上一主题 下一主题

请帮忙看下这个代码错在什么地方 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-06-10 16:46 |只看该作者
就叫klocwork.  

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
12 [报告]
发表于 2010-06-10 16:49 |只看该作者
回复 8# toniz

Dynamically allocated memory can be lost after assignment operator.

写得越来越明显了……

论坛徽章:
0
13 [报告]
发表于 2010-06-10 16:53 |只看该作者
  
他说动态分配的内存丢失是指什么地方呢?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
14 [报告]
发表于 2010-06-10 16:55 |只看该作者
9楼

论坛徽章:
0
15 [报告]
发表于 2010-06-10 16:56 |只看该作者
MyData(MyData &r) { data = strdup(r.data); }
内存泄漏

论坛徽章:
0
16 [报告]
发表于 2010-06-10 17:01 |只看该作者
本帖最后由 rain_fish 于 2010-06-10 17:04 编辑

总结一下:
1. 14楼说的内存泄露并不存在, 构造函数调用时data本身并没有申请内存
2. 需要实现赋值构造函数,否则默认的赋值函数只是值拷贝
MyData& operator= (const MyData& other)
{
    if ( !data )
        free(data);
    data = strdup(other.data);
}

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
17 [报告]
发表于 2010-06-10 17:17 |只看该作者
回复 15# rain_fish

1. free对空指针的反应是keep silence, 包括delete也是一样。

所以:
if (p) free(p);
if (p) delete p;

都是废话, 直接:
free(p);
delete p;

2. 构造函数保证data不为空

if (data) 总是true

3. 构造时使用的是new[]

所以free是错的。

4. strdup并不是一个C/C++标准函数

用是可以用, 但也可以使用别的, 比如memcpy。

5. 析构使用delete[]

所以strdup是错的。


一个简单的, 无错的, 可能低效的:

  1. MyData& MyData::operator=(MyData const& other)
  2. {
  3.       size_t len = strlen(other.data);
  4.       char* p = new char[len+1];
  5.       memcpy(p, other.data, len+1);
  6.       delete[] data;
  7.       data = p;
  8. }
复制代码

评分

参与人数 1可用积分 +1 收起 理由
rain_fish + 1

查看全部评分

论坛徽章:
0
18 [报告]
发表于 2010-06-10 17:17 |只看该作者
不太清楚你们讨论的是嘛问题,不是析构函数中释放了内存的嘛{:2_167:}
高手们就是高深哇

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
19 [报告]
发表于 2010-06-10 17:22 |只看该作者
本帖最后由 OwnWaterloo 于 2010-06-10 17:23 编辑

上面是我看错了。 把 if (!data) 看作 if (data)了 (因为这样写的人实在太多)

修改:

1. free 对空指针是keep silence

if (!data) free(data);
总是什么都不做。

2. 构造函数保证data不为空

if (data) 总是false

free(data) 总不执行

然后data被赋值为另一个指针(指向原地址的最后一个引用丢失)

论坛徽章:
0
20 [报告]
发表于 2010-06-10 17:31 |只看该作者
有点明白了,是不是这样子的:

用D2去初始话D1的时候,如果不作处理,则D2和D1都指向同一个字符串,如果D2离开了域,并且D2的析构函数被调用了。那么D1就会指向一个被删除的内存区。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP