c语言 申请1k内存,怎么解决函数内申请内存,函数外释放的问题
由于不同的編譯器和庫,其內部關于內存申請釋放的實現不同,因此不能直接要求用戶指定用某個函數釋放內存,必須要單獨自己封裝一個釋放的接口。有兩種思路:
一是以指針作為參數得到數組地址,單獨設計一個釋放的函數,內部與你的獲取數組函數內存管理函數一致。
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)) {
// 創建成功,使用數組 arr
// 使用完畢釋放數組
CloseArray(array);
}
二是學習微軟,對外隱藏全部的結構,僅返回一個類似 HANDLE 這樣的匿名類型,內部包裝自己的數據結構,任何數據都通過這個 HANDLE 來訪問。
// 聲明自己的私有結構體
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);
// 使用數組 arr
CloseObject(obj);
}
總結
以上是生活随笔為你收集整理的c语言 申请1k内存,怎么解决函数内申请内存,函数外释放的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABAQUS2017安装问题:以下应用程
- 下一篇: VMware workstations