怎么解決函數(shù)內(nèi)申請內(nèi)存提陶,函數(shù)外釋放的問題

問題如下
現(xiàn)在我有個算法烫沙,需要動態(tài)決定生成的數(shù)組長度,如果我在函數(shù)內(nèi)申請內(nèi)存隙笆,然后返回未知長度的數(shù)組锌蓄,就需要函數(shù)外來釋放內(nèi)存。但這種模式很不好撑柔,因為我只負責這個函數(shù)的實現(xiàn)瘸爽,你不能要求別人幫你釋放內(nèi)存,應該怎么做合適铅忿?剪决?注意是C語言,不是C++檀训;

不同的編譯器和庫柑潦,內(nèi)部關(guān)于內(nèi)存申請與釋放的實現(xiàn)不同,因此不能直接要求用戶指定用某個函數(shù)釋放內(nèi)存峻凫,必須要單獨自己封裝一個接口渗鬼。

有兩種思路。

一種是以指針作為參數(shù)得到數(shù)組地址荧琼,單獨設(shè)計一個釋放的函數(shù)乍钻,內(nèi)部與你的獲取數(shù)組函數(shù)內(nèi)存管理函數(shù)一致。

BOOL CreateArray(int **pp)
{
    if (pp != NULL) {
        // 其他算法
        int *array = (int *)malloc(...);
        if (array != NULL) {
            *pp = array;
            return TRUE;
        }
    }
    return FALSE;
}

void CloseArray(int *p)
{
    if (p != NULL) {
        free(p);
    }
}
// 使用
int *array = NULL;
if (CreateArray(&array)) {
    // 創(chuàng)建成功铭腕,使用數(shù)組 arr
    // 使用完畢釋放數(shù)組
    CloseArray(array);
}

二是學習微軟银择,對外隱藏全部的結(jié)構(gòu),僅返回一個類似 HANDLE 這樣的匿名類型,內(nèi)部包裝自己的數(shù)據(jù)結(jié)構(gòu)呆抑,任何數(shù)據(jù)都通過這個 HANDLE 來訪問捌袜。

// 聲明自己的私有結(jié)構(gòu)體
typedef struct {
    int *arr;
    // 其他成員變量
} EXAMPLE;

HANDLE CreateObject()
{
    EXAMPLE *handle = (EXAMPLE *)malloc(sizeof(EXAMPLE));
    if (handle != NULL) {
        // 其他算法
        handle->arr = (int *)malloc(...);
        if (handle->arr == NULL) {
            free(handle);
            handle = NULL;
        }
    }
    return (HANDLE)handle;
}

int *GetArray(HANDLE p)
{
    EXAMPLE *handle = (EXAMPLE *)p;
    if (handle != NULL) {
        return handle->arr;
    } else {
        return NULL;
    }
}

void CloseObject(HANDLE p)
{
    EXAMPLE *handle = (EXAMPLE *)p;
    if (handle != NULL) {
        if (handle->arr != NULL) {
            free(handle->arr);
        }
        free(handle);
    }
}
// 使用
HANDLE obj = CreateObject();
if (obj != NULL) {
    int *array = GetArray(obj);
    // 使用數(shù)組 arr
    CloseObject(obj);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市析孽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌只怎,老刑警劉巖袜瞬,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異身堡,居然都是意外死亡邓尤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汞扎,“玉大人季稳,你說我怎么就攤上這事〕浩牵” “怎么了景鼠?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長痹扇。 經(jīng)常有香客問我铛漓,道長,這世上最難降的妖魔是什么鲫构? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任票渠,我火速辦了婚禮,結(jié)果婚禮上芬迄,老公的妹妹穿的比我還像新娘问顷。我一直安慰自己,他們只是感情好禀梳,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布杜窄。 她就那樣靜靜地躺著,像睡著了一般算途。 火紅的嫁衣襯著肌膚如雪塞耕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天嘴瓤,我揣著相機與錄音扫外,去河邊找鬼。 笑死廓脆,一個胖子當著我的面吹牛筛谚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播停忿,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼驾讲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了席赂?” 一聲冷哼從身側(cè)響起吮铭,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颅停,沒想到半個月后谓晌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡癞揉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年纸肉,在試婚紗的時候發(fā)現(xiàn)自己被綠了溺欧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡毁靶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逊移,到底是詐尸還是另有隱情预吆,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布胳泉,位于F島的核電站拐叉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扇商。R本人自食惡果不足惜凤瘦,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望案铺。 院中可真熱鬧蔬芥,春花似錦、人聲如沸控汉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姑子。三九已至乎婿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間街佑,已是汗流浹背谢翎。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沐旨,地道東北人森逮。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像磁携,于是被迫代替她去往敵國和親吊宋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容