C++ new delete new[] delete[]重载实现

2023-11-02

篇博文主要是分析了C++ new()和构造函数的执行,delete()与析构函数的调用方式,通过全局重载和局部重载看清楚调用的关系

[cpp]  view plain  copy
  1. using namespace std;  
  2. #include <iostream>  
  3. #include <cstdlib>  
  4.   
  5. class Student{  
  6.   
  7. public:  
  8.   
  9.     Student(){  
  10.         cout <<  "Constructer" << endl;  
  11.     }  
  12.   
  13.     ~Student(){  
  14.         cout << "析构函数" << endl;  
  15.     }  
  16.   
  17.     static void* operator new(size_t size){  
  18.         cout << "own new function" << endl;  
  19.         Student* stu = (Student*)::operator new(size);  
  20.         return stu;  
  21.   
  22.     }  
  23.   
  24.     static void operator delete(void* p){  
  25.         cout << "own delete function" << endl;  
  26.         ::delete p;  
  27.     }  
  28.   
  29.     static void* operator new[](size_t size){  
  30.         cout <<  "own new[] function" <<endl;  
  31.         return ::operator new(size);  
  32.     }  
  33.      
  34. };  
  35.   
  36.   
  37. void* operator new(size_t size){  
  38.     cout << "global new function" << endl;  
  39.     void* p = malloc(size);  
  40.     return p;  
  41. }  
  42.   
  43.   
  44. void operator delete(void * p){  
  45.     cout << "global delete function"<< endl;  
  46.     free(p);  
  47. }  
  48.   
  49. void operator delete[](void* p){  
  50.     cout << "global delete[] function" << endl;  
  51.     free(p);  
  52. }  
  53.   
  54. void main(){  
  55.   
  56.     Student* student = new Student();  
  57.     delete student;  
  58.   
  59.     //Student* student2 = new Student[5];  
  60.     //delete[] student2;  
  61.   
  62.     cin.get();  
  63. }  


可以看出执行顺序为:内部重载的new-->全局重载的new()--->malloc()-->构造函数初始化-->内部的析构函数---》内部的delete()--》全局的delete()-->free()函数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ new delete new[] delete[]重载实现 的相关文章

  • 使用gdb将地址转换为行

    我有一个由剥离的应用程序生成的堆栈跟踪 如下所示 Check failure stack trace 0x7f0e442d392d unknown 0x7f0e442d7b1f unknown 0x7f0e442d7067 unknown
  • 无法摆脱 GDB 中的“值已被优化掉”

    我正在调试CPython可执行的GDB尽管禁用了所有变量 但仍无法获取某些变量的值GCC优化 gdb print co value has been optimized out gdb frame 0 PyEval EvalFrameDef
  • 我可以使用 GDB 来调试正在运行的进程吗?

    在linux下 我可以使用GDB来调试当前正在运行的进程吗 您可以使用以下命令附加到正在运行的进程gdb p PID
  • windows下无法使用mingw/gdb在eclipse helios cdt上调试小程序,控制台冻结

    我一直在尝试使用 Eclipse CDT 来做一些 C 示例 我可以使用 run 命令很好地运行它们 但是每当我尝试调试时 控制台窗口就会冻结 我可以输入 但程序不运行不继续了 当我调试时 我在控制台窗口上得到以下输出 没有断点 但由于默认
  • 在不附加 GDB 的情况下获取所有线程的堆栈跟踪

    有没有一种方法可以在不附加 GDB 的情况下打印所有线程的堆栈跟踪 或者是否有一个命令可以用作 gdb 批处理模式来打印所有线程的堆栈跟踪 elfutils https sourceware org elfutils 除其他实用程序外 还包
  • fork 后调试子进程(配置了 follow-fork-mode 子进程)

    我正在开发一个应用程序 父级分叉子级来处理某些任务 我遇到一个问题 我已将 gdb 配置为 follow fork mode 子级 但在 fork 后 到达断点后 它发送 SIGTRAP 但子级以某种方式终止并向父级发送 SIGCHLD 我
  • 如何在 gdb 中打印长字符串的完整值?

    我想在 GDB 中打印 C 字符串的完整长度 默认情况下它是缩写的 如何强制 GDB 打印整个字符串 set print elements 0 来自GDB手册 https sourceware org gdb onlinedocs gdb
  • 如何知道gdb附加了哪个进程(stat: T)?

    当 gdb 附加进程时 该进程的 stat 为 T 例如 root 6507 0 0 0 0 67896 952 Ss 12 01 0 00 mytest root 6508 0 0 0 0 156472 7120 Sl 12 01 0 0
  • 在运行时从应用程序读取调试信息

    除了调试之外 我还有一些关于调试符号以及可以用它们做什么的问题 我最感兴趣的是有关 GCC 的答案 但我也很高兴知道它在其他编译器 包括 MSVC 下的样子 首先 调试符号的常见格式 类型有哪些 它们与编译器和平台有何关系 GCC 和 Mi
  • 如何从 gdb 命令提示符执行外部命令?

    我正在使用 gdb 调试程序 每当我错过断点或决定添加另一个观察点时 我必须终止该进程并重新运行它 为了将现有的 gdb 附加到它 我使用attach
  • GDB 函数参数上的条件中断

    我想在函数参数大于某个值时设置断点 下面的虚拟代码 int main void uint64 t num 123456 uint64 t x 847534 uint64 t other num x x num other stuff her
  • dprintf 与 break + 命令 + continue 之间有什么区别?

    例如 dprintf main hello n run 生成与以下内容相同的输出 break main commands silent printf hello n continue end run 使用是否有显着的优势dprintf ov
  • 观察点固定地址

    对于我当前的嵌入式应用程序 我尝试将 GDB 观察点放在固定的内存地址处 例如 我的应用程序更新以下地址 0x10793ad0 为了确定代码的哪一部分破坏了值 我尝试了 watch 0x10793ad0 即使 GDB 在此之后不会打印任何错
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 为什么 GDB 启动一个新的 shell 以及如何禁用此行为?

    我正在解决一个问题 即从 GDB 启动应用程序会导致符号查找错误 但从 shell 启动它却可以 事实证明 每当你从 GDB 中启动一个程序时 它都会启动一个新的 shell 从而覆盖我在启动 GDB 之前设置的所有环境变量 例如LD LI
  • gcc 中 -g 选项的作用是什么

    我看到很多关于 gdb 的教程要求在编译 c 程序时使用 g 选项 我无法理解 g 选项的实际作用 它使编译器将调试信息添加到生成的二进制文件中 此信息允许调试器将代码中的指令与源代码文件和行号相关联 拥有调试符号可以使某些类型的调试 例如
  • Macports 安装 binutils

    我正在尝试通过 macports 在 Lion 上安装 gnu ld 我已经从 macports 安装了 gcc 4 6 但是我需要创建 elf 二进制形式的二进制文件 我作为单独的问题发布here https stackoverflow
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 如何使 gdb 在反汇编模型上显示原始的非修改函数名称?

    void outputString const char str cout lt lt outputString const char str lt lt str lt lt endl 原来是 Dump of assembler code

随机推荐

  • ChatGPT的功能,优势,以及在生活中的应用

    ChatGPT是一种基于人工智能技术的聊天机器人 它可以模拟人类的对话方式 与用户进行交互 ChatGPT的功能和优势非常多 下面将详细介绍 ChatGPT的功能 1 自然语言处理 ChatGPT可以理解自然语言 识别用户的意图和需求 从而
  • 关于golang的http库及常用库

    go语言作为一个面向网络 面向服务 高并发的一门通用语言 http库是非常重要的 下面我们来了解http库及其他标准库 http库可以对客户端做很多的工作 下面我们来看一下 func main resp err http Get https
  • xxl-job的使用及简述原理

    文章目录 前言 1 介绍 2 部署篇 2 1 初始化数据库 2 2 部署调度中心 2 2 1 集群部署 2 3 部署执行器 2 3 1 集群部署 3 使用篇 3 1 设置执行器 3 2 新建任务 3 3 启动任务 3 4 查看日志 4 原理
  • layuiadmin(官方)知识点

    动态模板 layuiAdmin 的视图是一个 动静结合 的载体 除了常规的静态模板 你当然还可以在视图中存放动态模板 因此它可谓是焦点中的焦点 定义模板 在视图文件中 通过下述规则定义模板 下面是一个简单的例子 在不对动态模板设定数据接口地
  • Rust gRPC 库 tonic 使用记录

    tonic 使用记录 服务端 cargo run bin server 客户端 cargo run bin client
  • sendfile“零拷贝”、mmap内存映射、DMA

    原创连接 https blog csdn net z69183787 article details 104760890 utm source app groupmessage KAFKA推送消息用到了sendfile 落盘技术用到了mma
  • Java入门基础第7天【Java Eclipse安装教程和修改汉化教程】

    活动地址 CSDN21天学习挑战赛 六款Java常用的开发工具 我们在学习 Java 语言程序设计必须选择一个功能强大 使用简单 能够辅助程序设计的 IDE 集成开发环境 在Java入门基础第6天 我们认识了Java六款常用的开发工具 这篇
  • 网络层(三)

    网络层 网络层基本上就是围绕着路由器展开的 因此我们很有必要学习路由器的工作原理 首先 路由器由三个部分组成 输入端口 交换结构 输出端口 我们一个一个来分析 输入端口 输入端口需要完成的任务 接收分组 确定分组应该转发到哪个输出端口 那输
  • Vue3实现数据子传父

    Vue3实现数据子传父 子组件页面 html 子组件上需要用到的方法
  • android毕业论文致谢,毕业论文致谢10篇(精选)

    毕业论文致谢10篇 精选 最后深深的感谢呵护我成长的父母 每当我遇到困难的时候 父母总是第一个给我鼓励的人 回顾20多年来走过的路 每一个脚印都浸满着他们无私的关爱和谆谆教诲 10年的在外求学之路 寄托着父母对我的殷切期望 他们在精神上和物
  • 浏览器报错:您的连接不是私密连接。 简单的处理方法

    经常会遇到以上这种提示 您的连接不是私密连接 导致无法访问网页 简单的处理方法就是 鼠标焦点在在浏览器窗口 非浏览器输入框 的任意位置输入以下英文字符串 thisisunsafe 输入完毕页面即可自动跳转正常访问
  • Java十进制转三进制

    pre class java 十进制转三进制 只实现了整数部分 author CaoChenMiao public class TentoSan private int TtS int inNum int index throws Exce
  • Go实战学习笔记-1.3流程控制

    1 前言 这里还是再总结一下流程控制 和其它语言相比做了一些优化 比如相比c增加了迭代器类型的for循环 switch针对c中容易出问题的地方做了一些修改 避免出现缺少break时存在的常见问题 此外 和Java类似也存在跳出循环和多层嵌套
  • 【操作系统】王道考研 p53 文件的基本操作

    文件的基本操作 知识总览 创建文件 在外存中找到空间 在目录中创建目录项 删除文件 找到目录项 回收磁盘块 删除目录项 打开文件 找到文件名对应目录项 将目录项复制到 打开文件表 中 注意 有两种打开文件表 系统的打开文件表和进程的打开文件
  • echarts绘制关系图

    效果图 代码
  • VLC 播放器开发的SDK

    http download videolan org pub videolan vlc 3 0 0 win32 最近想试着自己写个播放器看看 于是选择了VLC 但是找不到sdk 这个是我千辛万苦找到的
  • 十五、多线程【黑马JavaSE笔记】

    文章目录 多线程 一 实现多线程 1 进程 2 线程 3 多线程的第一种实现方式 4 设置和获取线程名称 5 线程控制 6 线程的生命周期 7 多线程的第二种实现方式 二 线程同步 1 案例 卖票 2 卖票案例数据安全问题的解决 3 同步代
  • SQL注入(pikachu)字符型注入和搜索型注入

    一 字符型注入 1 判断column列数 注意 前面加上 进行闭合 中间是判断列数的sql语句 后面的注释掉 在url中要这么写 1 union select 1 2C2 23或者 1 union select 1 2 2 页面源文件代码
  • QT的文件处理

    QFile文件操作 可读写文本文件 二进制文件和QT资源文件 在QFile中可以使用从QIODevice中继承的readLine函数读取文本文件的一行 QFile file zk txt if file open QIODevice Rea
  • C++ new delete new[] delete[]重载实现

    篇博文主要是分析了C new 和构造函数的执行 delete 与析构函数的调用方式 通过全局重载和局部重载看清楚调用的关系 cpp view plain copy using namespace std include