码农知识堂 - 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);这样更能看出来函数的声明。原生的实话说不太好看明白。

  • 相关阅读:
    iNFTnews|Web3的核心是什么?一些需要考虑的观点
    MATLAB算法实战应用案例精讲-【推荐系统】CTR预估模型(补充篇)
    linux下常用shell脚本
    服务器数据恢复-RAID信息破坏导致服务器操作系统无法启动的数据恢复案例
    Docker
    腾讯WXG前端面经
    springboot项目面试题
    如何翻译英文音频?看完你就学会了
    Spring-MVC的文件上传下载,及插件的使用(让项目开发更节省时间)
    Spring Cloud 面试题
  • 原文地址:https://blog.csdn.net/A315776/article/details/126586246
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号