开发者社区> 问答> 正文

C语言使用回调函数解决内存申请和释放的问题? 400 报错

C语言使用回调函数解决内存申请和释放的问题? 400 报错

C语言中,函数参数或者返回值中如果包含指针指向动态分配的内存区域,那么管理申请和释放就显得十分麻烦,一不小心就容易出错,今天突发奇想借鉴高级语言函数式编程的思想,其实C语言里的函数指针已经非常完美了,如果这样写,管理起来就会很方便,callback中无需关注buffer的释放。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 回调函数
// 使用这种技巧,在回调函数中就不用关注缓冲区的释放了
void callback(const char * buffer, int len) {
    int i;
    for (i = 0; i < len; i++) {
        putchar(buffer[i]);
    }
    putchar('\n');
}

void foo(void (* callback)(const char *, int)) {
    char * buffer;
    buffer = (char *)malloc(100);
    memset(buffer, 0, 100);
    strcpy(buffer, "Hello, World!");
    callback((const char *)buffer, strlen(buffer));
    free(buffer);
}

int main() {
    // 下面两种方式都行,不知道为什么
    foo(&callback);
    foo(callback);
    return 0;
}

展开
收起
爱吃鱼的程序员 2020-06-03 15:45:17 738 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    因为&callback == callback

    void foo()可以写成这样比较清晰

    typedef void (* callbackPtr)(...) ;

    void foo(callbackPtr cb)() 

    {

    if (!cb) return; //还可以检查空值

    ...

     cb(...);

    ...

    }

    这种写法在win32里很常见,如CreateThread()就用到

    ######

    不好意思,没太看懂这个是什么意思。

    博主能稍微详细点讲一下吗。

    你说用回调函数控制申请和释放内存,可是申请和释放内存并不在回调函数里啊?

    ######  绑定一个指向函数的空指针 然后用free包装这个函数指针?简单项目写复杂声明 不怕被骂么 呵呵######基本原则还是谁调用, 谁释放, 这里使用的方式是调用者管理内存空间。######基本原则还是谁调用, 谁释放, 这里使用的方式是调用者管理内存空间。######

    如果callback是异步的,就没有用处了~

    ######感觉没多大用处######看不懂######感觉和普通释放没什么去边 建议看看android系统源码的智能指针 写的不错######多次一举  南辕北辙  谢谢
    2020-06-03 17:19:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
低代码开发师(初级)实战教程 立即下载