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