当前位置: 首页 > 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;

相关文章:

  • 用织梦模板做网站南京seo按天计费
  • 山东做网站建设公司网站快照优化公司
  • 企业做网站和开展电子商务的好处百度流量
  • 漳州软件开发公司优化关键词方法
  • wordpress自动添加视频播放器武汉seo首页
  • 个人网站做经营性成都seo招聘信息
  • 大语言模型(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神经网络多输入单输出回归预测模型