怎么解决函数内申请内存,函数外释放的问题

问题如下
现在我有个算法,需要动态决定生成的数组长度,如果我在函数内申请内存,然后返回未知长度的数组,就需要函数外来释放内存。但这种模式很不好,因为我只负责这个函数的实现,你不能要求别人帮你释放内存,应该怎么做合适??注意是C语言,不是C++;

不同的编译器和库,内部关于内存申请与释放的实现不同,因此不能直接要求用户指定用某个函数释放内存,必须要单独自己封装一个接口。

有两种思路。

一种是以指针作为参数得到数组地址,单独设计一个释放的函数,内部与你的获取数组函数内存管理函数一致。

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);
}

你可能感兴趣的:(怎么解决函数内申请内存,函数外释放的问题)