+ -
当前位置:首页 → 问答吧 → 求助:内存释放问题。。

求助:内存释放问题。。

时间:2010-07-27

来源:互联网

void GetDiskPerHandler ::free_mount_entry_node(struct mount_entry *node)
{
  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

回复 goubao198562


    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

回复 goubao198562


    --------------------------------------------------------------------------------


请问,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

回复 goubao198562


    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[0x2aaaab9cd346]
/OSM/agent/lib/libperformancehandler.so(_ZN19CSnmpDiskPerHandler21free_mount_entry_listEP11mount_entry+0x47)[0x2aaaab9cd3b3]
/OSM/agent/lib/libperformancehandler.so(_ZN19CSnmpDiskPerHandler11outDiskInfoEv+0x33[0x2aaaab9cdab2]
/OSM/agent/lib/libperformancehandler.so(_ZN19CSnmpDiskPerHandler18queryComponentImplEPSt3mapIN7Agentpp4OidxESt6vectorIiSaIiEESt4lessIS2_ESaISt4pairIKS2_S5_EEER8CPackage+0xf6)[0x2aaaab9cdc78]


我想就是这个,你说这是什么问题??。

作者: yangqing320119   发布时间: 2010-07-27

要养成释放内存之后置0的好习惯,  double free or corruption (out) 两次释放同一段内存
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