問題如下:
現(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);
}