免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1262 | 回复: 7
打印 上一主题 下一主题

内存泄漏。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-21 00:07 |只看该作者 |倒序浏览
程序如下写法:
class CSubscrb
{
public:
        string SubscrbID;
        string SvcNum;
        string SubscrbStat;
        string StatDate;
        CSubscrb(char *id,char *svcnum,char *stat, char *statdate)
        {
                SubscrbID=id;
                SvcNum=svcnum;
                SubscrbStat=stat;
                StatDate = statdate;
        };
        ~CSubscrb(){};
};

typedef list<CSubscrb>; LIST_CSubscrb;

LIST_CSubscrb  list_Subscrb;
LIST_CSubscrb::iterator  Plist_Subscrb;

list_Subscrb.push(CSubscrb("00001","222","10","20041201");
程序结束时:
for (Plist_Subscrb=list_Subscrb.begin()list_Subscrb!list_Subscrb.end()list_Subscrb++)
{
                Plist_Subscrb->;SubscrbID="";
        Plist_Subscrb->;SvcNum="";
        Plist_Subscrb->;SubscrbStat="";
        Plist_Subscrb->;StatDate="";
}
但该程序还是发生了内存泄漏。
不知道什么原因。
谢谢支持。

论坛徽章:
0
2 [报告]
发表于 2004-09-21 02:03 |只看该作者

内存泄漏。

程序中的错误:

// list_Subscrb.push(CSubscrb("00001","222","10","20041201");
list_Subscrb.push_back(CSubscrb("00001","222","10","20041201");

//  for (Plist_Subscrb=list_Subscrb.begin()list_Subscrb!list_Subscrb.end()list_Subscrb++)
for (Plist_Subscrb=list_Subscrb.begin()list_Subscrb != list_Subscrb.end()list_Subscrb++)

你上面的程序中不会发生内存泄漏。不知道你这样说的根据是什么?

论坛徽章:
0
3 [报告]
发表于 2004-09-21 02:15 |只看该作者

内存泄漏。

不好意思,语法错误是我贴错了。

ps -elf 看到该进程的内存不断增加,不释放。

论坛徽章:
0
4 [报告]
发表于 2004-09-21 02:36 |只看该作者

内存泄漏。

其原因有两个:

1. 类似  Plist_Subscrb->;SubscrbID="";  这样使 string 内容为空的操作不会释放原来的内存空间,这是 string 类的特点。所以如果你程序结束时执行这样的操作是希望释放其原来占用的内存空间话,那这段程序就是多余的——达不到这样的目的。

2. 编译器不会立即把在程序中释放的内存归还给操作系统;虽然已经被释放,但是这些内存空间仍然归程序使用。从程序外面来看就是内存不被释放。这其实是编译器的一种优化,目的是加快下一次内存分配的效率,是正常的。

论坛徽章:
0
5 [报告]
发表于 2004-09-21 11:29 |只看该作者

内存泄漏。

1. 类似 Plist_Subscrb->;SubscrbID=""; 这样使 string 内容为空的操作不会释放原来的内存空间,这是 string 类的特点。所以如果你程序结束时执行这样的操作是希望释放其原来占用的内存空间话,那这段程序就是多余的——达不到这样的目的。

string 基于引用计数,必须这样手动释放内存,否则会内存泄漏。不知道你所说多余怎么回事?

2. 编译器不会立即把在程序中释放的内存归还给操作系统;虽然已经被释放,但是这些内存空间仍然归程序使用。从程序外面来看就是内存不被释放。这其实是编译器的一种优化,目的是加快下一次内存分配的效率,是正常的。

我的程序在生产系统上连续几天增加到170m,而且还在增加。
这个也正常吗?

论坛徽章:
0
6 [报告]
发表于 2004-09-21 11:55 |只看该作者

内存泄漏。

《《《我的程序在生产系统上连续几天
和你说的
《《《程序结束时:......
怎么解释?连续几天后才执行了代码中的for吧?

并且你如何认定是以上的代码造成内存泄漏?

论坛徽章:
0
7 [报告]
发表于 2004-09-21 12:51 |只看该作者

内存泄漏。

该程序每天能跑几十万次,for 语句每次都会用到。
我想应该是string造成的泄漏,但不知道怎么解决。

论坛徽章:
0
8 [报告]
发表于 2004-09-21 13:17 |只看该作者

内存泄漏。

>;>; string 基于引用计数,必须这样手动释放内存,否则会内存泄漏。不知道你所说多余怎么回事?

没听说过 string 是基于引用,不知道你说的是什么意思。所有的C++标准库中的容器类(包括 string)对于它们的元素来说都是建立的内部拷贝,而不是引用。此为其一。

容器类的一个设计原则就是由类自己管理其使用的内存,使程序员从内存管理中解脱出来。此为其二。

如果你对此还有怀疑,你可以检查 string 对象的 capacity() 的返回值来确定它目前占用的内存,看一看 string 类对象在给它赋值为空串后这个值是否有变化。

>;>; 我的程序在生产系统上连续几天增加到170m,而且还在增加。这个也正常吗?

你在这里提供的这些代码是不存在内存泄漏问题的,但问题是这并不是你程序的全部吧。如果真有内存泄漏问题,那也是在程序的其它部分。

至于你说的这个问题,不知道具体情况,所以不好说程序正常不正常。但是有一点,如果你没有对C++标准库作一番认真的研究(各个容器类的特点、各种方法或者算法使用的前提条件等)就匆匆使用它的话,这样写的程序很容易出问题,因为C++标准库中存在着许多“陷阱”,稍微疏忽就可能出现问题,对此你应该有充分的认识。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP