当前位置: 首页 > news >正文

C/C++ New 操作符重载

C++中 new 操作符的重载

在C++中,new 运算符可以被重载,以提供自定义的内存分配行为。重载 new 运算符的函数原型如下:

void* operator new(std::size_t size) throw(std::bad_alloc);

此外,还可以重载 new[] 运算符(用于分配数组)和 delete/delete[] 运算符(用于释放内存)。这些重载函数的原型如下:

// new
void* operator new(std::size_t size) throw(std::bad_alloc);
void* operator new[](std::size_t size) throw(std::bad_alloc);// delete
void operator delete(void* ptr) noexcept;
void operator delete[](void* ptr) noexcept;

注意,从C++11开始,抛出异常的重载版本已被弃用,建议使用不抛出异常的版本。不抛出异常的版本如下:

// new
void* operator new(std::size_t size) noexcept(true);
void* operator new[](std::size_t size) noexcept(true);// delete
void operator delete(void* ptr) noexcept;
void operator delete[](void* ptr) noexcept;

此外,还可以为类重载 new/delete 运算符,这样就可以为该类的对象提供自定义的内存分配行为。一般在做 windows 驱动开发时候,使用自定义类型的动态内存构建,可以对new/delete 重载,类成员重载函数的原型如下:

class MyClass {
public:// newstatic void* operator new(std::size_t size) noexcept(true);static void* operator new[](std::size_t size) noexcept(true);// deletestatic void operator delete(void* ptr) noexcept;static void operator delete[](void* ptr) noexcept;
};

请注意,重载 new/delete 运算符时,应确保正确处理内存分配和释放,以避免内存泄漏和其他问题。

Windows 驱动开发中重写 new/delete

#pragma once// 基类定义new/delete操作符
class Base
{public:// 重定义 new 操作符.static void* __cdecl operator new(size_t size, unsigned tag = 'base') noexcept;// 重定义 delete 操作符.static void __cdecl operator delete(void* ptr) noexcept;// 析构函数.virtual ~Base() {}
};#include "Base.h"
#include <ntifs.h>void* __cdecl Base::operator new(size_t size, unsigned tag) noexcept
{DbgPrint("[Base]Operator new run.\r\n");return ExAllocatePool2(POOL_FLAG_PAGED, size, tag);
}void __cdecl Base::operator delete(void* ptr) noexcept
{DbgPrint("[Base]Operator delete run.\r\n");ExFreePool(ptr);
}
#include "Base.h"class Derived : public Base
{
public:void test() {DbgPrint("This is a test.");   }
}// 调用代码如下
auto p = new Derived(); // new ('abcd')Derived();
p->test();
delete p;
http://www.dtcms.com/a/259024.html

相关文章:

  • 大语言模型(LLM)初探:核心概念与应用场景
  • C#.Net筑基-优雅LINQ的查询艺术
  • 批量DWG转PDF工具
  • 第⼀个与⼤模型交互的应⽤
  • GBDT:梯度提升决策树——集成学习中的预测利器
  • 每日AI资讯速递 | 2025-06-25
  • Odoo OWL 前端开发:ORM 与 RPC 服务的选择
  • DAY 42 Grad-CAM与Hook函数
  • Spring Boot中日志管理与异常处理
  • flex布局实例:把色子放进盒子里
  • 資訊安全 (Information Security)3大 “CIA“要素
  • Jenkins X + AI:重塑云原生时代的持续交付范式
  • 【151】基于Springboot+Vue实现的校园订餐管理系统小程序(有文档+PPT+视频)
  • 小程序快速获取url link方法,短信里面快速打开链接
  • 基于springboot+vue的智慧农业专家远程指导系统
  • DeepSeek+WinForm串口通讯实战
  • Nginx + Tomcat 负载均衡搭建
  • 云计算产业链
  • 文档处理控件Aspose.Words教程:在.NET中将多页文档转换为单个图像
  • 回归预测 | Matlab实现KAN神经网络多输入单输出回归预测模型
  • [LVGL] 刷新率优化
  • 入门级STM32F103C8T6无人机遥控(原理图)
  • 一步部署APache编译安装脚本
  • 设备维修全流程记录,提升设备运维效率
  • django request.data.get 判断有没有 某个参数
  • 日本生活:日语语言学校-日语作文-沟通无国界(5)-题目:我的一天
  • 【MCP服务】蓝耘元生代 | MCP平台:部署时间服务器MCP,开启大模型交互新体验
  • 理论加案例,一文读懂数据分析中的分类建模
  • [架构之美]Redis客户端命令指南
  • 在树莓派上用 .NET8.0 挂载TCP服务端