第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

思索了好幾個(gè)小時(shí)沒(méi)找到答案,想請(qǐng)教下大神們,這是為什么呢?

思索了好幾個(gè)小時(shí)沒(méi)找到答案,想請(qǐng)教下大神們,這是為什么呢?

慕村9548890 2023-03-03 16:12:54
自定義mynew和myfree函數(shù),如果myfree函數(shù)中num 的類型為int,在運(yùn)行過(guò)程中,ps aux看到程序的RSS一直增加(不降下來(lái)),存在內(nèi)存泄漏。如果myfree函數(shù)中num的類型為size_t,那么RSS就不會(huì)增加PS:機(jī)器是64位的,sizeof(size_t)=8位,sizeof(int)=4位void* mynew(size_t sz){void* p = malloc(sizeof(size_t) + sz) ;memcpy(p, &sz, sizeof(size_t));pthread_mutex_lock(&mutex);mCnt += sz + sizeof(size_t);printf("malloc sz[%d], mCnt[%d], fCnt[%d]\n", sz+sizeof(size_t), mCnt, fCnt);pthread_mutex_unlock(&mutex);return p+sizeof(size_t);}void myfree(void* prt){void* p = prt - sizeof(size_t);if (p == NULL){printf("pbuf is NULL\n");return ;}size_t num = 0;memcpy(&num, p, sizeof(size_t));pthread_mutex_lock(&mutex);fCnt += num + sizeof(size_t);printf("free sz[%d], fCnt[%d], mCnt[%d]\n", num, fCnt, mCnt);pthread_mutex_unlock(&mutex);free(p);}
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊

具體來(lái)說(shuō),myfree中的num變量在內(nèi)存中緊鄰著p變量,如果你將num申明為int,那他只占四個(gè)字節(jié),而你初始化num的時(shí)候  memcpy(&num, p, sizeof(size_t));   卻會(huì)將8個(gè)字節(jié)拷進(jìn)去,這會(huì)修改緊鄰這num的變量p,直接導(dǎo)致p被清零(如果malloc free外加修改的話,清的不一定是0),而free函數(shù)在傳入空指針是不做處理的。我把代碼修改了一下,你可以看一下下面程序的輸出,對(duì)應(yīng)myfree的free那一行,實(shí)際被free的是空指針。


#include <stdio.h>#include <malloc.h>#include <pthread.h>#include <unistd.h> int fCnt = 0, mCnt = 0; pthread_mutex_t mutex; void *mynew(size_t sz) {    void *p = malloc(sizeof(size_t) + sz);    memcpy(p, &sz, sizeof(size_t));    pthread_mutex_lock(&mutex);    mCnt += sz + sizeof(size_t);    printf("malloc sz[%d], mCnt[%d], fCnt[%d]\n", sz + sizeof(size_t), mCnt,            fCnt);    pthread_mutex_unlock(&mutex);    return p + sizeof(size_t);} void myfree(void *prt) {    void *p = prt - sizeof(size_t);    if(p == NULL) {        printf("pbuf is NULL\n");        return;    }    int num = 0; // error!    // size_t num = 0;    printf("%p, %p\n", &p, &num);    memcpy(&num, p, sizeof(size_t));    pthread_mutex_lock(&mutex);    fCnt += num + sizeof(size_t);    printf("free sz[%d], fCnt[%d], mCnt[%d]\n", num, fCnt, mCnt);    pthread_mutex_unlock(&mutex);    printf("try to free %p\n", p);    free(p);} int main() {    void *p = mynew(100);    printf("p is %p\n", p);    myfree(p);    usleep(1000000);    return 0;}


查看完整回答
反對(duì) 回復(fù) 2023-03-06
  • 1 回答
  • 0 關(guān)注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)