C++:operator new/delete函数

每个类默认都会有一个全局范围的 operator newoperator delete 接口,它们是由标准库提供的,可以用于动态内存分配和释放。如果一个类没有显式定义自己的 operator newoperator delete,默认的全局版本会被使用。


默认 operator new 的特点

  1. 定义

    • 默认的 operator new<new> 头文件中定义。
    • 它分配一块指定大小的内存(以字节为单位),并返回其地址。
  2. 实现(概念上):

    void* operator new(std::size_t size) {if (void* p = std::malloc(size)) // 使用 malloc 分配内存return p;throw std::bad_alloc();         // 如果分配失败,抛出异常
    }
    
  3. 全局版本
    默认情况下,所有类都使用全局范围的 operator newoperator delete

    void* operator new(std::size_t size);
    void operator delete(void* ptr) noexcept;
    
  4. 例子

    class MyClass {
    public:int x;
    };MyClass* obj = new MyClass();  // 使用全局的 operator new 分配内存
    delete obj;                    // 使用全局的 operator delete 释放内存
    

自定义 operator new

可以为某个类自定义 operator newoperator delete,从而覆盖默认行为。例如:

  1. 自定义类专属的 operator new

    class MyClass {
    public:void* operator new(std::size_t size) {std::cout << "MyClass::operator new called\n";return std::malloc(size); // 自定义内存分配逻辑}void operator delete(void* ptr) noexcept {std::cout << "MyClass::operator delete called\n";std::free(ptr); // 自定义内存释放逻辑}
    };MyClass* obj = new MyClass();  // 调用 MyClass 自定义的 operator new
    delete obj;                    // 调用 MyClass 自定义的 operator delete
    
  2. 自定义操作对其他类的影响

    • 自定义的 operator newoperator delete 只适用于该类及其派生类,不会影响其他类或全局的内存分配行为。
    • 如果调用的是全局范围的 newdelete,将使用默认版本。

全局 operator new

除了类的自定义版本,可以重载全局范围的 operator newoperator delete

  1. 重载全局版本

    void* operator new(std::size_t size) {std::cout << "Global operator new called\n";return std::malloc(size);
    }void operator delete(void* ptr) noexcept {std::cout << "Global operator delete called\n";std::free(ptr);
    }
    
  2. 影响范围

    • 所有未自定义 operator new 的类都会使用全局版本。

注意事项

  1. 静态对象和栈对象

    • 对于静态或栈分配的对象,operator newoperator delete 不会被调用。
    • 它们只针对动态分配的内存。
    MyClass obj;  // 不会调用 operator new 或 operator delete
    
  2. 继承与多态

    • 如果基类和派生类分别定义了 operator new,则会根据具体类调用对应的版本。
  3. 内存对齐

    • 默认版本的 operator new 保证分配的内存满足类型的对齐要求。
    • 如果需要特殊对齐,可以重载带对齐参数的 operator new

总结

  1. 默认的 operator newoperator delete 是全局提供的,所有类默认都会使用它们。
  2. 可以自定义某个类的 operator newoperator delete,以满足特定的内存分配需求。
  3. 对于动态内存管理,C++ 提供了很高的灵活性和可控性,但同时需要谨慎处理以避免内存泄漏和错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Video Duplicate Finder 快速识别并去除重复的视频和图像!

文章目录 下载 后续升级 Video Duplicate Finder&#xff08;视频重复查找器&#xff09;是一款开源的跨平台视频&#xff08;以及图像&#xff09;去重软件&#xff0c;通过对比文件内容和特征&#xff0c;快速识别出重复的视频和图像文件&#xff0c;即使是被压缩裁剪过、…

力扣力扣力:860柠檬水找零

860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 需要注意的是&#xff0c;我们一开始是没有任何钱的&#xff0c;也就是说我们需要拿着顾客的钱去找零。如果第一位顾客上来就是要找零那么我们无法完成&#xff0c;只能返回false。 分析&#xff1a; 上来我们先不分…

字符串与十六进制表示的字符串相互转换字符串倒序

字符串转为十六进制表示的字符串: /// <summary> /// 此方法用于将普通字符串转换成16进制的字符串。 /// </summary> /// <param name"_str">要转换的字符串。</param> /// <returns></returns&g…

开源许可协议

何同学推动了开源协议的认识&#xff0c;功不可没&#xff0c;第一次对开源有了清晰的认识&#xff0c;最宽松的MIT开源协议 源自OSC开源社区&#xff1a;何同学使用开源软件“翻车”&#xff0c;都别吵了&#xff01;扯什么违反MIT

装饰器---python

一、柯里化 概念&#xff1a;将原来接受两个参数的函数变成新的接受一个参数的函数过程&#xff0c;新的函数返回一个以原有第二个参数为参数的函数 例如&#xff1a; 例一 原函数是add(x,y),柯里化的目标是add(x)(y),如何实现呢&#xff1f; 相当于嵌套函数&#xff0c;有闭…

Spring AI 框架使用的核心概念

一、模型&#xff08;Model&#xff09; AI 模型是旨在处理和生成信息的算法&#xff0c;通常模仿人类的认知功能。通过从大型数据集中学习模式和见解&#xff0c;这些模型可以做出预测、文本、图像或其他输出&#xff0c;从而增强各个行业的各种应用。 AI 模型有很多种&…

知识见闻 - 数学: 均方根 Root Mean Square

What is Root Mean Square (RMS)? 在统计学上&#xff0c;均方根&#xff08;RMS&#xff09;是均方的平方根&#xff0c;而均方是一组数值的平方的算术平均数。均方根也称为二次均值&#xff0c;是指数为 2 的广义均值的一种特例。均方根也被定义为基于一个周期内瞬时值的平方…

基于Spring AI alibaba组件AI问答功能开发示例

基于Spring AI alibaba组件AI问答功能开发示例 功能效果图&#xff1a; http://localhost:9999/ai/test http://localhost:9999/ai/chat?inputai 配置 application.yaml 指定 API-KEY&#xff08;可通过访问阿里云百炼模型服务平台获取&#xff0c;有免费额度可用。&#x…

Linux - 线程基础

文章目录 1.什么是线程2.线程vs进程3.线程调度4.线程控制4.1 POSIX线程库4.2创建线程4.3线程终止4.4线程等待4.5线程分离 5、线程封装 1.什么是线程 在Linux操作系统中&#xff0c;线程是进程内部的一个执行流。在Linux操作系统下&#xff0c;执行流统称为轻量级进程&#xff0…

5、AI测试辅助-生成测试用例思维导图

AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐&#xff09;2、Markdown思维导图版本&#xff08;推荐&#xff09; 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素&#xff1a; 1、测试模块 2、测试标题 3、前置条件 4、…

学习日志014--用python实现顺序表

之前我们用c语言实现顺序表&#xff0c;今天就然我们用python来复习一遍 一、创建顺序表 python的类可以代替c中的结构体作为复合数据类型。 创建学生类&#xff0c;并用装饰器将方法属性化&#xff0c;便于之后的修改。属性装饰器&#xff0c;可以在保护私有属性&#xff0…

PTA编程题:N个数求和

问题描述 思路分析 问题分解 输入处理&#xff1a;将分数拆解为分子和分母&#xff0c;存储并处理。 分数相加规则&#xff1a; 即分子相加、分母相乘。 结果化简&#xff1a;求分数的最大公因数&#xff08;GCD&#xff09;&#xff0c;将其约分至最简形式。 带分数处理&…

Selenium + 数据驱动测试:从入门到实战!

引言 在软件测试中&#xff0c;测试数据的多样性和灵活性对测试覆盖率至关重要。而数据驱动测试&#xff08;Data-Driven Testing&#xff09;通过将测试逻辑与数据分离&#xff0c;极大地提高了测试用例的可维护性和可扩展性。本文将结合Selenium这一流行的测试工具&#xff0…

RK3568平台(中断篇)ARM中断流程

一.ARM 处理器程序运行的过程 ARM芯片属于精简指令集计算机 (RISC: Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点: ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 ③ 使用RISC指令的CPU复杂度小一点,易于设计 比如对于 a=a+b 这…

视频修复技术和实时在线处理

什么是视频修复&#xff1f; 视频修复技术的目标是填补视频中的缺失部分&#xff0c;使视频内容连贯合理。这项技术在对象移除、视频修复和视频补全等领域有着广泛的应用。传统方法通常需要处理整个视频&#xff0c;导致处理速度慢&#xff0c;难以满足实时处理的需求。 技术发…

推荐一款专业电脑护眼工具:CareUEyes Pro

CareUEyes Pro是一款非常好用的专业电脑护眼工具&#xff0c;软件小巧&#xff0c;界面简单&#xff0c;它可以自动过滤电脑屏幕的蓝光&#xff0c;让屏幕显示更加的不伤眼&#xff0c;更加舒适&#xff0c;有效保护你的眼睛&#xff0c;可以自定义调节屏幕的色调&#xff0c;从…

04 - 镜像存储机制

04 - 镜像存储机制 1. OverlayFS 存储原理 OverlayFS 结构分为三个层: LowerDir、Upperdir、MergedDir LowerDir &#xff08;只读层&#xff09; 只读的 image layer&#xff0c;其实就是 rootfs, 在使用 Dockfile 构建镜像的时候, Image Layer 可以分很多层&#xff0c;所以…

Element UI 组件库详解【Vue】

文章目录 一、引言二、安装并使用1. 安装2. 使用 三、常见组件说明1. 基础组件2. 布局组件3. 布局容器4. 选择框组件5. 输入框组件6. 下拉框组件7. 日期选择器8. 上传组件9. 表单组件10. 警告组件11. 提示组件12. 表格组件 一、引言 官方网站&#xff0c;element.eleme.cn El…

通过socket设置版本更新提示

1.项目使用的是git所以使用git仓库的短哈希作为版本更新标识&#xff0c;将该字符写入public文件&#xff0c;此处需要注意后端访问静态资源的路径。 在vue.config.js文件中写入 function excuteVersion() {const fs require(fs)const { execSync } require(child_process)…

相机触发模式

参考自&#xff1a;相机触发模式_硬触发和软触发的区别-CSDN博客 一、图像采集模式分类 相机的图像采集模式分为内触发模式与外触发模式。其中内触发模式包含连续采集、单帧采集两种形式&#xff1b;外触发模式包含软件外触发、硬件外触发。本文以海康相机的软件平台作介绍&a…