求助:内存释放问题。。
时间:2010-07-27
来源:互联网
{
free(node->me_devname);
free(node->me_mountdir);
free(node->me_type);
free(node);
printf("me_devname=%d,me_mountdir=%d,me_type=%d,node=%d\n",node->me_devname,node->me_mountdir,node->me_type,node);
}
void GetDiskPerHandler :: free_mount_entry_list(struct mount_entry *head)
{
struct mount_entry * tmp = NULL;
while( head != NULL )
{
tmp = head;
head = head->me_next;
free_mount_entry_node(tmp);
}
}
作者: yangqing320119 发布时间: 2010-07-27
作者: goubao198562 发布时间: 2010-07-27
struct mount_entry * GetDiskPerHandler :: read_filesystem_list()
{
struct mount_entry *mount_list;
struct mount_entry *me,*temp;
struct mntent *mnt;
char *table = MOUNTED;
FILE *fp;
char *devopt;
fp=setmntent(table,"r");
if(fp==NULL)
printf("setmntent error\n");
mount_list=temp=me=new mount_entry;
while ((mnt = getmntent (fp)))
{
me->me_devname = xstrdup (mnt->mnt_fsname);
me->me_mountdir = xstrdup (mnt->mnt_dir);
me->me_type = xstrdup (mnt->mnt_type);
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
devopt = strstr (mnt->mnt_opts, "dev=");
/* Add to the linked list. */
temp=new mount_entry;
me->me_next=temp;
me=temp;
}
me->me_next=NULL;
。。。
return mount_list;
}
作者: yangqing320119 发布时间: 2010-07-27
--------------------------------------------------------------------------------
请问,free_mount_entry_list()... 对不。。。
void GetDiskPerHandler ::free_mount_entry_node(struct mount_entry *node) 中
me_devname=0,me_mountdir=5255872,me_type=5255904,node=5251664
me_devname=5251648,me_mountdir=5256032,me_type=5256064,node=5255936
me_devname=5255920,me_mountdir=5256192,me_type=5256224,node=5256096
me_devname=5256080,me_mountdir=5256352,me_type=5256384,node=5256256
me_devname=5256240,me_mountdir=5256512,me_type=5256544,node=5256416
me_devname=5256400,me_mountdir=5256672,me_type=5256704,node=5256576
me_devname=5256560,me_mountdir=5256832,me_type=5256864,node=5256736
me_devname=5256720,me_mountdir=0,me_type=0,node=5256896
为什么有这红色的为0 ,而其他的不为0,??
还有,整个程序单独在main()可以运行。。,但我把它在另外个类中实例化后调用,出错。。所有我怀疑这是不是,我的内存释放,等有问题。望指点
作者: yangqing320119 发布时间: 2010-07-27
enter read mount list commet
Total size is 929.475525G Free size is 924.007935G UsedSize is 5.467590G
enter read mount list commet
enter read mount list commet
enter read mount list commet
enter read mount list commet
enter read mount list commet
enter read mount list commet
enter read mount list commet
finished read mount list comment
now ready to entry free_mount_entry_list
enter free_mount_entry_list
enter free_mount_entry_node
enter free_mount_entry_node
enter free_mount_entry_node
enter free_mount_entry_node
enter free_mount_entry_node
enter free_mount_entry_node
enter free_mount_entry_node
enter free_mount_entry_node
*** glibc detected *** ./snmpapp: double free or corruption (out): 0x00002b79d4087a10 ***
======= Backtrace: =========
/lib64/libc.so.6[0x2b79d3eb731e]
/lib64/libc.so.6(__libc_free+0x6c)[0x2b79d3eb8d7c]
/OSM/agent/lib/libperformancehandler.so(_ZN19CSnmpDiskPerHandler21free_mount_entry_nodeEP11mount_entry+0x2

/OSM/agent/lib/libperformancehandler.so(_ZN19CSnmpDiskPerHandler21free_mount_entry_listEP11mount_entry+0x47)[0x2aaaab9cd3b3]
/OSM/agent/lib/libperformancehandler.so(_ZN19CSnmpDiskPerHandler11outDiskInfoEv+0x33

/OSM/agent/lib/libperformancehandler.so(_ZN19CSnmpDiskPerHandler18queryComponentImplEPSt3mapIN7Agentpp4OidxESt6vectorIiSaIiEESt4lessIS2_ESaISt4pairIKS2_S5_EEER8CPackage+0xf6)[0x2aaaab9cdc78]
我想就是这个,你说这是什么问题??。
作者: yangqing320119 发布时间: 2010-07-27
void GetDiskPerHandler ::free_mount_entry_node(struct mount_entry *node)
{
if (node->me_devname)
{
free(node->me_devname);
node->me_devname = 0;
}
if (node->me_mountdir)
{
free(node->me_mountdir);
node->me_mountdir = 0;
}
if (node->me_type)
{
free(node->me_type);
node->me_type = 0
}
free(node);
node = 0;
printf("me_devname=%d,me_mountdir=%d,me_type=%d,node=%d\n",node->me_devname,node->me_mountdir,node->me_type,node);
}
作者: goubao198562 发布时间: 2010-07-27
struct mount_entry
{
~mount_entry()
{
if (node->me_devname)
{
free(node->me_devname);
node->me_devname = 0;
}
if (node->me_mountdir)
{
free(node->me_mountdir);
node->me_mountdir = 0;
}
if (node->me_type)
{
free(node->me_type);
node->me_type = 0
}
}
...
}
这时定义释放函数就明朗多了
void GetDiskPerHandler ::free_mount_entry_node(struct mount_entry *node)
{
if (node)
{
free(node);
node = 0;
} printf("me_devname=%d,me_mountdir=%d,me_type=%d,node=%d\n",node->me_devname,node->me_mountdir,node->me_type,node);
}
作者: goubao198562 发布时间: 2010-07-27
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28