static void(*set_malloc_handler(void(*f)() ) ) ()

前言

标题所示的是什么意思?
写成下面的形式就容易看了:

typedef void (* p_f)();
static p_f set_malloc_handler(p_f f);

下面尝试进行解释

添加一些空格,方便阅读
static void( *set_malloc_handler(  void(*f)()  ) )  ();

下面对一些概念进行说明:

  1. 返回指针的函数(这个指针指向一个函数)。首先有一个函数,函数名为set_malloc_handler,这个函数的形参列表为空,这个函数返回一个指针,这个指针指向一个函数(该函数形参列表为空返回类型为void):
    void (*set_malloc_handler() ) ()
  2. 函数的形参列表为指向函数的指针
    void set_malloc_handler(  void(*f)()   )
  3. 1和2结合,即它是一个函数,形参列表为一个指针(该指针指向一个函数),返回值也是一个指针(该指针也指向一个函数):
    static void( *set_malloc_handler( void(*f)() ) ) ();

如何看?

首先从左向右找到名称,找到名称后从右向左看,括号优先级较高,同级别运算顺序为从左向右。首先找到set_malloc_handler,由于*的优先级低于()所以set_malloc_handler和括号结合,set_malloc_handler( void(*f)() )为函数名和其形参列表,剩下的则为其返回值,void(*)(),他的形参为 void(*f)()。


总结

更详细的讨论:

https://www.cnblogs.com/yangjiquan/p/11465376.html

typedef void(*MALLOCALLOC)(); //将void (*)() 重命名成MALLOCALLOC template<int inst> class _MallocAllocTemplate { private: static void* _OomMalloc(size_t); //malloc失败的时候调用的函数 static MALLOCALLOC _MallocAllocOomHandler; //函数指针,内存不足的时候的处理机制 public: static void* _Allocate(size_t n) //分配空间n个字节的空间 { void *result=0; result = malloc(n); if (0 == result) //若果malloc失败,则就调OOM_malloc _OomMalloc(n); return result; } static void _DeAllocate(void *p) //释放这块空间 { free(p); } static MALLOCALLOC _SetMallocHandler(MALLOCALLOC f) //这是一个函数,参数是一个函数指针,返回值也是一个函数指针 { MALLOCALLOC old = _MallocAllocOomHandler; _MallocAllocOomHandler = f; //将内存分配失败的句柄设置为f(让它指向一个内存失败了,让系统去释放其他地方空间的函数) return old; } }; template<int inst> void(* _MallocAllocTemplate<inst>::_MallocAllocOomHandler)()=0; //默认不设置内存不足处理机制 template<int inst> void* _MallocAllocTemplate<inst>::_OomMalloc(size_t n) { MALLOCALLOC _MyMallocHandler; //定义一个函数指针 void *result; while (1) { _MyMallocHandler = _MallocAllocOomHandler; if (0 == _MyMallocHandler) //没有设置内存不足处理机制 throw std::bad_alloc(); //则抛出异常 (*_MyMallocHandler)(); //调用内存不足处理的函数,申请释放其他地方的内存 if (result = malloc(n)) //重新申请内存 break; } return result; //申请成功时,则返回这块内存的地址 } typedef _MallocAllocTemplate<0> malloc_alloc;请你仔细分析上述代码的逻辑,并说明每一行代码的作用,此外对 (*_MyMallocHandler)(); //调用内存不足处理的函数,申请释放其他地方的内存这一行代码我不明白,它是怎么申请释放内存的?
03-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值