new[]和new调用地址的简单跟踪

2023-05-16

重写这两个操作符, 插入打印语句,可获得调用地址。代码如下:

#include <Windows.h>
#include <iostream>
#include <stdlib.h>
#include <vcruntime_new.h>
#include <vcruntime_exception.h>
#include <xmemory>
#pragma comment(linker, "/ThrowingNew")

CRITICAL_SECTION cs;

bool bArray = false;
void doneit(void* addr, bool alloc)
{
    if (alloc)
    {
        std::cout << "alloc " << std::hex << addr << std::endl;
        std::cout << "--------" << std::endl;
        return;
    }

    std::cout << "free " << std::hex << addr << std::endl;
}

void* __CRTDECL operator new(size_t const size)
{
    ::EnterCriticalSection(&cs);

    if (!bArray)
    {
#ifndef _M_IX86
        __int64* p = &size;
#else
        int* p = (int*)&size;
#endif

        p--;
        std::cout << "new addr " << std::hex << *p << std::endl;
    }

    bArray = false;
    ::LeaveCriticalSection(&cs);

    for (;;)
    {
        if (void* const block = malloc(size))
        {
            doneit(block, true);
            return block;
        }

        if (_callnewh(size) == 0)
        {
            if (size == SIZE_MAX)
            {
                throw std::exception("bad alloc, SIZE_MAX");

            }
            else
            {
                throw std::exception("bad alloc");
            }
        }
    }
}

void __CRTDECL operator delete(void* const block) noexcept
{
    doneit(block, false);

#ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK);
#else
    free(block);
#endif
}

void* __CRTDECL operator new[](size_t const size)
{
    ::EnterCriticalSection(&cs);
#ifndef _M_IX86
    __int64* p = &size;
#else
    int* p = (int*)&size;
#endif

    p--;
    std::cout << "new[] addr " << std::hex << *p << std::endl;

    bArray = true;

    ::LeaveCriticalSection(&cs);

    return operator new(size);
}


#define SUCCESS 0
int main()
{
    ::InitializeCriticalSection(&cs);
    int ret = SUCCESS;

    int* p = new int[32];
    if (!p)
        ret |= 1;

    char* ch = new char;
    if (!ch)
        ret |= 2;


    if (!(ret & 1))
    {
        delete[]p;
        p = NULL;
    }

    if (!(ret & 2))
    {
        delete ch;
        ch = NULL;
    }

    ::DeleteCriticalSection(&cs);

    return ret;
}

运行结果如下, 地址正确:

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

new[]和new调用地址的简单跟踪 的相关文章

  • JS中new Date().format("YYYY-mm-dd")提示format is not a function的解决办法

    format方法已经被移除了 xff0c 赶快换个组件 xff01 如果是个懒人 xff0c 就不要再看那些自己写方法大神给的函数了 xff01 xff01 用moment xff0c npm一下子就能装好 xff0c 很好用 xff01
  • delete释放new[] 以及 delete[]释放new 的问题

    在同花顺 的笔试过程中遇到这么一个类似问题 A ptr 61 new A 10 for int i 61 0 i lt n i 43 43 delete amp ptr i 由此衍生出两个问题 new 申请的空间用delete释放会发生什么
  • 重构 - 消除重复的new创建

    如下 xff1a 有时会遇到这种重复的new创建 span class token keyword public span span class token keyword class span span class token class
  • 用new调用函数的四步走

    JS规定 xff0c 使用new调用函数会进行四步走 xff1a 1 函数体内会自动创建出一个空白对象 2 函数的上下文 xff08 this xff09 会自动指向这个对象 3 函数体内的语句会执行 4 函数会自动返回上下文对象 xff0
  • new Date() 方法到底是获取什么时间

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 问题 java 中 xff0c new Date 方法 获取的时间 xff0c 究竟与当前的系统时间有什么关联 xff1f 简单的时刻对应关系吗 xff1f 2 测试环
  • c++ new运算符是如何调用构造函数的

    文章目录 内存申请和对象构造placement new答案很简单参考链接 内存申请和对象构造 本文内容简短 xff0c 只为记录下一次思考过程 xff0c 事情起源于一句话 xff0c new操作符会调用operator new分配内存再调
  • C++构造函数中使用new

    注意事项 如果在构造函数中使用new来初始化指针成员 xff0c 则应在析构函数中使用delete new和delete必须相互兼容 new对应delete xff0c new 对应于delete 如果有多个构造函数 xff0c 则必须以相
  • 2022 New Year‘s Resolution

    Some Might Say 2022 New Year 39 s Resolution Some might say we are on the edge of the new era Always are they saying thi
  • C++(1) 指针 new 和delete

    1 概念 new typeName pointer name 61 new typeName delete delete pointer name 注意 xff1a 1 new之后要判断 xff0c 指针是否为NULL xff0c 内存被耗
  • ambiguating new declaration of 问题的解决

    今天在运行代码的时候 一直在报这样的错误 ambiguating new declaration of int NewPartition seqlist int int 查看了许久 原来是头文件中的声明类型与函数实现的声明类型不一致造成的
  • new ScriptEngineManager().getEngineByName(“js“)返回null

    问题出现的场景 xff1a 本地开发和生产环境都没问题 xff0c 测试环境 用的docker 报空指针 new ScriptEngineManager getEngineByName 34 js 34 返回null js替换 JavaSc
  • c++中 new的使用方法

    c 43 43 中 xff0c new的用法很灵活 xff0c 这里进行了简单的总结 1 new 分配这种类型的一个大小的内存空间 并以括号中的值来初始化这个变量 2 new 分配这种类型的n个大小的内存空间 并用默认构造函数来初始化这些变
  • 重载new和delete检测内存泄漏

    内存泄漏就是new出来的内存没有通过delete合理的释放 重载new和delete检测内存泄漏原理是 xff1a 在重载的new中记录内存分配情况 xff0c 在重载的delete中删除内存分配记录 xff0c 从而跟踪所有内存分配信息
  • django连接elasticsearch失败Failed to establish a new connection: [Errno 113] No route to host[Errno 111]

    做django商城项目时报错 错误信息 urllib3 exceptions NewConnectionError lt urllib3 connection HTTPConnection object at 0x7fa6b2537390
  • js中获取时间new Date()详细介绍

    1 var myDate 61 new Date Date 返回当日的日期和时间 getDate 从 Date 对象返回一个月中的某一天 1 31 getDay 从 Date 对象返回一周中的某一天 0 6 getMonth 从 Date
  • C++ malloc/free/new/delete详解(内存管理)

    这里写目录标题 malloc free 典型用法 内存分配 实现过程 brk和mmap 申请小于128k的内存 申请大于128k的内存 释放内存 brk和mmap的区别 new delete 典型用法 内存分配 实现过程 new delet
  • virtual,override,new ,extern,abstract修饰符

    方法定义中可以使用的修饰符有 a new b public c protected d internal e private f static g virtual h override i extern j abstract 对于virtu
  • 经典C语言面试题1:malloc 和 new的区别?

    malloc free是 C C语言的标准库函数 而new delete是C 的运算符 malloc内存分配成功返回的类型为void 需要通过强制类型转换将void 转换为我们需要的类型 new内存分配失败时会抛出bac alloc异常 不
  • Haxe: class, object, new and constructor

    haxe 类 对象 new 和 构造函数 package if neko import neko Lib import neko io File end class Thing public function new trace new f
  • 20个常见的Java错误以及规避方法

    原文 50 Common Java Errors and How to Avoid Them Part 1 作者 Angela Stringfellow 翻译 雁惊寒 译者注 本文介绍了20个常见的Java编译器错误 每种错误都包含了代码片

随机推荐

  • jetson nano 安装anaconda和pytorch 指定目录安装 完整安装方法

    前言 xff1a 由于jetson nano 是aarch64架构 xff0c Anaconda官方不支持aarch64架构 xff0c 所以有了一个叫 Archiconda xff0c 其目的就是将conda移植到aarch64平台上 资
  • Latex的学习

    因为种种原因 xff0c 要学一下latex 一个非常快速的 Latex 入门教程 哔哩哔哩 bilibili 适用 xff1a 快速切换格式和排版 即会将文档的内容和排版区分开 markdown适用于轻量文字编辑 常用工具 xff1a 1
  • VTK经典四格图

    右下角的是使用Volume绘制的三维图
  • vim常用指令类表

    最近开始Linux环境下编程 xff0c 有时需要使用vim浏览和修改代码 xff0c 特意学习了一下 xff0c 并整理了一些常用指令 xff0c 如下所示 VIM常用命令 工作模式 正常模式 Esc编辑模式 i可视选择模式 v文件 打开
  • 2021-06-23

    root 64 localhost cat usr share applications Lxg desktop Desktop Entry Name 61 Lxg Type 61 Application Exec 61 home lys
  • gcc编译过程

    1 下载相应代码库 xff0c 解压到一个大的文件夹的各子文件夹 2 执行脚本 cd gmp 5 0 0 make clean configure disable shared enable static prefix 61 usr loc
  • 【vscode】去除黄色波浪下划线

    vscode 去除黄色波浪下划线 vscode在使用过程中 xff0c 如果出现变量名下方出现黄色波浪线 xff0c 影响编程效率 可能原因是由于安装了pylint这个库 xff0c 并没有进行合适的设置 我们可以在设置中查找 34 pyt
  • Volume 多边形裁剪测试

    vtk自带了一个Volume剪切的例子 xff0c 可以用隐函数确定的剪切面裁剪vtkImageData 本人对该例子代码略加修改 xff0c 剪切口为一个封闭的梯形 其代码和配置文件如下 目录 ClipVolume cxx CMakeLi
  • VTK应用程序连接出现vtkRenderingOpenGL_AutoInit_Construct(void)报错解决方法一则

    出现vtkRenderingOpenGL AutoInit Construct void 报错 xff1a xff08 1 xff09 具体报错为 xff1a error LNK2019 无法解析的外部符号 34 void cdecl vt
  • 在Debian下安装输入法的过程

    执行下面的命令 xff1a sudo apt get install software properties common apt add repository ppa fcitx team nightly sudo apt get upd
  • 【MITK】在Windows中编译MITK

    1 在Git Bash执行下面的命令 cd D mkdir MITK cd MITK git clone https phabricator mitk org source mitk git MITK cd MITK cmake S B W
  • 解决WSL中Debian显示中文乱码的问题

    1 sudo apt get install locales 2 sudo dpkg reconfigure locales 勾选 zh CN XX 3 sudo locale gen 4 sudo apt get install ttf
  • WSL中Debian配置中文输入法

    1 sudo apt install dbus x11 im config fonts noto fcitx fcitx pinyin fcitx sunpinyin fcitx googlepinyin 2 fcitx autostart
  • Windows 下获得当前线程上下文并保存到dump文件测试之2

    include lt Windows h gt include lt Dbghelp h gt include lt excpt h gt include lt exception gt include lt iostream gt inc
  • 使用函数钩子实现打印throw异常时的调用栈

    include lt Windows h gt include lt winnt h gt include lt Dbghelp h gt include lt excpt h gt include lt ehdata h gt inclu
  • MFC/QT混合编程时使用QMessageBox一例

    MFC QT混合编程的方法可以参考这个链接 xff1a MFC QT混合编程官方方法 1 使用QMessageBox可以这样 xff1a void CJxDicomerApp OnTest QWinWidget parent 61 new
  • C++流编程学习例子01

    C 43 43 流有一个类继承体制 xff0c 符合C 43 43 类的语义 下面的代码使用std cout作为std ostream引用 xff0c 能够正确输出信息 我们也可以用ofstream ostringstream等做类似操作
  • 洛谷P1593 因子和

    题目描述 输入两个正整数a和b xff0c 求a b的因子和 结果太大 xff0c 只要输出它对9901的余数 输入输出格式 输入格式 xff1a 仅一行 xff0c 为两个正整数a和b 0 a b 50000000 输出格式 xff1a
  • android layout view 编辑器

    DroidDraw is a graphical user interface GUI builder for the Android platform 下载地址 xff1a http code google com p droiddraw
  • new[]和new调用地址的简单跟踪

    重写这两个操作符 xff0c 插入打印语句 xff0c 可获得调用地址 代码如下 xff1a include lt Windows h gt include lt iostream gt include lt stdlib h gt inc