示例如下:
#include
using namespace std;
// 定义一个函数指针类型__malooc_aloc_oom_handler别名,实际为void(*)();
// 此处可以注释掉,因为直接使用void(*)()也是可以的
using __malooc_aloc_oom_handler = void(*)();
// 待测试传入的函数
void fun(){
cout << " name " << endl;
}
// 设置oom处理函数的函数句柄
// 函数名为set_malloc_handler
// 参数为void (*f)()函数指针
// 返回值为void (*)()函数指针
void (*set_malloc_handler(void (*f)()))(){
// __malooc_aloc_oom_handler fh = f;
void(*fh)() = f; // 可以运行!
(*fh)();
return fh;
}
int main(){
set_malloc_handler(fun);
return 0;
}
那么如果将它分装成类呢?
如下
#include
using namespace std;
void fun(){
cout << " name " << endl;
}
class oom_handler{
private:
void (*ph)();
public:
oom_handler():ph(nullptr){}
void (*set_malloc_handler(void (*f)()))(){
void (*old)() = ph;
ph = f;
return old;
}
void call(){
if(ph){
(*ph)();
}else{
cout << "ph is nullptr!\n";
}
}
};
int main(){
oom_handler oh;
oh.set_malloc_handler(fun);
oh.call();
oh.set_malloc_handler(nullptr);
oh.call();
return 0;
}
/*
name
ph is nullptr!
*/
当然也可以封装成静态的。
如果用现代c++进行改进的话,set_malloc_handler
可以进行改进,如下写法auto set_malloc_handler(functional
这样更能看出来函数的声明。原生的实话说不太好看明白。