码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 记一个SGI空间配置器的设置OOM处理函数的用法


    示例如下:

    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    那么如果将它分装成类呢?
    如下

    #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!
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    当然也可以封装成静态的。
    如果用现代c++进行改进的话,set_malloc_handler可以进行改进,如下写法auto set_malloc_handler(functional fun);这样更能看出来函数的声明。原生的实话说不太好看明白。

  • 相关阅读:
    php算法面试题及答案
    前端框架海洋:如何破浪前行,寻找你的“黄金舟”
    常用排序算法
    vue.js前端框架应用案例
    带你吃透Servlet技术
    MySQL进阶实战5,为什么查询速度会慢
    python将中文标点符号转换成英文标点符号然后再替换成回车符实现换行
    .NET Core 日志系统
    总结springboot项目中一些后端接收前端传参的方法
    云原生 黑马Kubernetes教程(K8S教程)笔记——第一章 kubernetes介绍——Master集群控制节点、Node工作负载节点、Pod控制单元
  • 原文地址:https://blog.csdn.net/A315776/article/details/126586246
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号