美文网首页
怎么解决函数内申请内存,函数外释放的问题

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

作者: 丶Em1tu0F | 来源:发表于2018-08-17 13:26 被阅读0次

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

相关文章

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

    问题如下:现在我有个算法,需要动态决定生成的数组长度,如果我在函数内申请内存,然后返回未知长度的数组,就需要函数外...

  • Delphi中踩过的坑

    函数 Function 内申请的变量如果是赋值给 Result 的需要外面用完,外释放今天在做这个函数的时候,在函...

  • [C++之旅] 6 内存的申请和释放

    [C++之旅] 6 内存的申请和释放 申请内存的方式 C语言方式 申请内存使用函数void *malloc(siz...

  • 不定长内存池研究

    传统的内存申请释放函数malloc/free 每申请一次内存或者释放一次内存都会触发内存管理调度。频繁的分配和回收...

  • [GeekBand] C++面向对象程序设计-2

    一个类的对象的生命历程如下: 申请内存——>初始化列表——>构造函数——>参与运算——>析构函数——>释放内存。 ...

  • JavaScript 内存溢出与内存泄露

    闭包的缺点 函数执行完之后,函数内的局部变量没有释放,占用内存的时间会变长。容易造成内存泄露。 上述代码没有释放a...

  • 智能指针

    智能指针可以不手动释放内存? 虚函数中虚构函数定义为虚函数的话,自动调用子类父类的虚函数释放内存。

  • c++学习笔记——第二天

    1、c++中的内存管理 C语言提供了malloc和free两个函数(库函数)实现,完成对内存的释放和申请,而c++...

  • C语言-静态开辟内存和动态开辟内存

    1、静态开辟内存 在函数局部内,创建的数据,在执行函数的时候会进栈操作,函数执行完毕,会执行弹栈。因此会释放栈内的...

  • C语言实现内存管理 (一)

    我们都知道 c 语言申请内存释放内存是 alloc / free 。直接调用函数就行,但是某些特定的场景无法调用 ...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/zkszbftx.html