PJM软件数据结构分析(怎样有效地避免内存泄露)

 

PJM 软件数据结构方面组织的还是不错的;

typedef struct PjmsPktHeader {

    int msgcode;                /*!< 銉°儍銈汇兗銈搞偝銉笺儔*/

    int errcode;                /*!< 銈ㄣ儵銉笺偝銉笺儔*/

    int16_t rscunit_id;         /*!< 銉︺儖銉冦儓ID*/

    int16_t reserved[3];        /*!< 浜堢磩*/

    struct timespec send_date;  /*!< 閫佷俊鏅傚埢*/

    struct timespec recv_date;  /*!< 鍙椾俊鏅傚埢*/

    ssize_t data_size;          /*!< 銉囥兗銈裤偟銈ゃ偤 */

    uint64_t data[0];           /*!< 銉囥兗銈块牁鍩?*/

} PjmsPktHeader_t;

里面的data种类多了;

PjmsPktHeader_t *pktdata_p

PjmsReqJobStart_t *job_start_p = NULL;

job_start_p = (PjmsReqJobStart_t *)pktdata_p->data;

 

typedef struct PjmsReqJobStart {       

    RmSjid_t       subjobid;            /*!< 銈搞儳銉朓D*/

    uint32_t       job_type;            /*!< 銈搞儳銉栥偪銈ゃ儣*/

    int32_t        reserved;            /*!< 浜堢磩*/

    PjmsVparam_t   vparam;              /*!< 灞炴€ф儏鍫?/

    PjmsExecUnit_t execunit;            /*!< 瀹熻鍗樹綅鎯呭牨銇搞伄銈儠銈汇儍銉?/

    int            num_fshare;          /*!< 銉曘偋銈偡銈с偄鎯呭牨鏁?*/

    int32_t        num_gionode;         /*!< 浣跨敤銇欍倠GIO銉庛兗銉夋暟. 銈广儐銉笺偢銉炽偘銈搞儳銉栦互澶栥伅0*/

    off_t          fshare_off;          /*!< 銉曘偋銈偡銈с偄鎯呭牨銇搞伄銈儠銈汇儍銉?*/

    off_t          gionode_list_off;    /*!< GIO銉庛兗銉塈D銇儶銈广儓銇搞伄銈儠銈汇儍銉? 銈广儐銉笺偢銉炽偘銈搞儳銉栦互澶栥伅0*/

} PjmsReqJobStart_t;

这样的话,有几个好处:(注意:其中1的好处是靠FJ那边能实现个功能,即把结构体里的off_t变量指向的内存空间都释放了,只有这个功能实现了,才能谈得上正确的内存释放

1:释放内存操作很简便的,直接释放pktdata_p就行了,后面的PjmsReqJobStart_t 结构体以及它附带的一些结构体内存分配(靠off_t实现的)可以被跟随着就释放了,从而避免担心内存泄露问题;

2:统一的报头格式PjmsPktHeader_t

3:利用off_t 形式可以将紧跟着PjmsReqJobStart_t后面的内存分配空间跟PjmsReqJobStart_t中的off型变量连接在一块,通过该off型变量就可以直接引用到PjmsReqJobStart_t后面的内存分配空间中的东西

4:这种结构体后带有后缀内存分配区域形式可以使内存利用更加紧凑;

5:PJMD和PJSD的通信就是这些数据包的传递来进行的,而这些数据包利用完后,又可以及时的释放,从而回收了内存,利用数据包的传递来进行PJSD的工作,也可以避免在PJSD中的零散小内存泄露

 

内存泄露现象怎么避免,有时感觉是架构设计方面的问题;

比如在running_exec函数及其调用子函数中

是两个数据在流动的,target_p 和 PjmsPktHeader_t型数据

靠这两个数据的流动,来完成函数主要功能和避免内存泄露(因为释放内存只要考虑着这两个数据就行了)

 

内存泄露可以通过集中数据的通信流来避免,就是不要随意的calloc出独立(要calloc出和其他结构体相关联的内存空间)的内存空间,通过将内存分配集中到几个主要数据结构体,并靠着这几大数据结构体来完成PJSD的主要功能,通过这种形式来避免内存泄露现象发生

 

虽然黑体部分的现象发现的晚,但感觉靠着数据通信的相互作用来促使完成PJSD功能的办法,是能够避免内存泄露的。

 

PJM软件的内存泄露主要集中在off_t型的变量没办法释放这一块。

 

又看了一遍,感觉那个黑体部分是不会出现内存泄露问题,因为

Free的原型是这样的:

void free(void *ptr);   

void *calloc(size_t nmemb, size_t size);

void *malloc(size_t size);

 

所以黑体部分的担心是多余的,所以PJM软件的这种数据结构组织还是不错的

上网查了查malloc函数的实现,搜到信息说如果用malloc分配的空间size这个值为2的整数倍的话,就会以后malloc的内存分配速度会大大加快,真的如此吗,还有待考证

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值