重载new和delete

2024-03-18

我尝试遵循这篇文章:http://flipcode.com/archives/How_To_Find_Memory_Leaks.shtml http://flipcode.com/archives/How_To_Find_Memory_Leaks.shtml

重载我的新函数和删除函数以跟踪内存泄漏。

但是 - 如果我尝试编译,我会得到一个

C2365:“operator new”:重新定义;以前的定义是“函数”

在 xdebug 文件中

xdebug 包含在 xlocale 中 - 但是,我找不到我的项目包含 xlocale 的位置

我在项目中使用 MFC 进行多线程处理。

有人可以告诉我如何让内存泄漏跟踪发挥作用吗?

//编辑: 这是我的 findMemoryLeak.h,我将其包含在 stdafx.h 的末尾

#ifndef _FINDMEMORYLEAK_H
#define _FINDMEMORYLEAK_H

#include <list>
using namespace std;

#ifdef _DEBUG

typedef struct {
    DWORD   address;
    DWORD   size;
    char    file[64];
    DWORD   line;
} ALLOC_INFO;

typedef list<ALLOC_INFO*> AllocList;

AllocList *allocList;

void AddTrack(DWORD addr,  DWORD asize,  const char *fname, DWORD lnum)
{
    ALLOC_INFO *info;

    if(!allocList) {
        allocList = new(AllocList);
    }

    info = new(ALLOC_INFO);
    info->address = addr;
    strncpy(info->file, fname, 63);
    info->line = lnum;
    info->size = asize;
    allocList->insert(allocList->begin(), info);
};

void RemoveTrack(DWORD addr)
{
    AllocList::iterator i;

    if(!allocList)
        return;
    for(i = allocList->begin(); i != allocList->end(); i++)
    {
        if((*i)->address == addr)
        {
            allocList->remove((*i));
            break;
        }
    }
};


void DumpUnfreed()
{
    AllocList::iterator i;
    DWORD totalSize = 0;
    char buf[1024];

    if(!allocList)
        return;

    for(i = allocList->begin(); i != allocList->end(); i++) {
        sprintf(buf, "%-50s:\t\tLINE %d,\t\tADDRESS %d\t%d unfreed\n",
            (*i)->file, (*i)->line, (*i)->address, (*i)->size);
        OutputDebugString(buf);
        totalSize += (*i)->size;
    }
    sprintf(buf, "-----------------------------------------------------------\n");
    OutputDebugString(buf);
    sprintf(buf, "Total Unfreed: %d bytes\n", totalSize);
    OutputDebugString(buf);
};


inline void * __cdecl operator new(unsigned int size, const char *file, int line)
{
    void *ptr = (void *)malloc(size);
    AddTrack((DWORD)ptr, size, file, line);
    return(ptr);
};

inline void __cdecl operator delete(void *p)
{
    RemoveTrack((DWORD)p);
    free(p);
};

inline void * __cdecl operator new[](unsigned int size, const char *file, int line)
{
    void *ptr = (void *)malloc(size);
    AddTrack((DWORD)ptr, size, file, line);
    return(ptr);
};

inline void __cdecl operator delete[](void *p)
{
    RemoveTrack((DWORD)p);
    free(p);
};
#endif

//make the normal new function call the new function with three parameters
#ifdef _DEBUG
#define DEBUG_NEW new(__FILE__, __LINE__)
#else
#define DEBUG_NEW new
#endif
#define new DEBUG_NEW


#endif

当我像这样将它包含在 stdafx.h 的末尾时,我收到数千个编译器错误,其中大多数在 xdebug 或 xlocale 中,第一个是

C2365:“operator new”:重新定义;以前的定义是“函数”

在 xdebug 中第 32 行


我不久前解决了这个问题。

正在发生的事情是这个词new当您达到重载时是一个宏(当然,它没有解决我们的链接问题),但尝试添加:

#undef new

在文件中最后一个包含指令之后但在第一个之前new超载。

edit

发生这种情况是因为stdafx.h(或其他包含定义 DEBUG_NEW 的文件)在将内存泄漏检测代码包含在某些 CPP 文件中之前包含(您应该能够从编译器错误中找出哪个)。因此new已被定义为宏,这会导致编译器对定义感到厌烦。

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

重载new和delete 的相关文章

  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959

随机推荐

  • 从服务中删除持续通知

    我有一项在启动时创建通知的服务 然后 ondestroy 我希望将其删除 我只是使用 cancel NOTIFICATION ID 当它是正常通知时它效果很好 但当我使用正在进行的事件时它不会取消它 我确实读到过一些关于如果 android
  • UILabel字体:粗体和斜体[重复]

    这个问题在这里已经有答案了 可能的重复 iPhone iPad的UILabel如何设置粗体和斜体 https stackoverflow com questions 4713236 how do i set bold and italic
  • 流音频中的降噪和压缩

    希望你能帮忙 我正在从麦克风录制音频并通过网络实时传输 样本的质量为 11025hz 8 位 单声道 虽然有一点延迟 1秒 但效果很好 我需要帮助的是我现在正在尝试实现降噪和压缩 以使音频更安静并使用更少的带宽 音频样本存储在 C 的 by
  • 计算给定记录的跳过值以进行排序分页

    我正在尝试使用 php 驱动程序计算 mongo db 集合中给定记录的跳过值 因此 获取给定的记录 找出该记录在整个集合中的索引 这可能吗 目前 我正在选择所有记录并手动对结果数组进行索引 这称为 前向分页 这是一个概念 您可以在使用 排
  • 2009 年 OpenGL 窗口库 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 尝试选择一个库来为我的 OpenGL 应用程序创建窗口并捕获用户输入 但选择太多 GLUT http
  • onActivityCreated/onStart/onViewCreated 方法中的 getView() 出现 NullPointerException 警告

    I know getView 可能会在内部返回 nullonCreateView 方法 但即使我把下面的代码放在里面onActivityCreated onStart or onViewCreated 方法 它仍然显示有关可能的警告Null
  • Java中ArrayList的排序

    排序的最佳方法是什么ArrayList
  • 从 Java 内部编译外部 .java 文件

    我正在制作一个工具 可以编写 java 文件 然后 希望 将这些文件编译为 class 文件 在整个过程中 用户选择写入多个 java 文件的文件目录 现在我想让程序编译这些Java文件 JavaCompiler是你的朋友 检查文档here
  • 相当于 az acr login 的 powershell 是什么

    使用powershell我们如何登录Azure容器注册表 提供的示例仅适用于 Azure CLI az acr login name
  • Pycharm 在相对路径中看不到带有 ../ 的文件

    我正在使用 pycharm 开发一个 python 项目 但是 问题是它拒绝加载相对路径包含的文件 当我尝试时 self image pygame image load resources img prey png convert alph
  • 在winRT MessageDialog中添加文本框

    我正在 Windows 8 商店应用程序中工作 我试图弹出一个对话框 让用户在文本框中输入信息 怎么做 The InputDialog http winrtxamltoolkit codeplex com SourceControl cha
  • Maven 检查样式作为构建的一部分

    如果存在一些问题 是否有可能以某种方式强制 Maven 使构建失败checkstyle错误 现在我必须跑site目标生成javadocs and checkstyle报告 我想成功install目标 如果 checkstyle 有一些错误
  • Yii - ajax 加载的表单元素的用户端验证

    我在静态表单中使用 Yii 用户端验证 这非常棒 但我不知道如何为 ajax 加载的元素添加验证器 我有一个简单的表单小部件 我想通过 AJAX 加载更多的输入字段 对于小型 jQuery 脚本来说这不是问题 但我不知道如何为加载的元素添加
  • WPF 中的进度条样式是老式的。酒吧增量。如何实现带有vista或windows-7阴影发光效果的进度条?

    WPF 中的进度条样式是老式的 酒吧增量 如何实现带有 vista 或 windows 7 阴影发光效果的进度条 图片http quickshare my3gb com download 2 JPG http quickshare my3g
  • C 指针和内存分配:Realloc 数组和指针传递

    对于那些有 C 经验的人来说 这将是一个简单的内存分配 引用问题 这是我的数据结构 struct configsection char name unsigned int numopts configoption options typed
  • 有没有办法用 Moq 来一般模拟 DbSet.Find 方法?

    我目前正在使用扩展方法来将 DbSets 一般模拟为列表 public static DbSet
  • CSV 未附加到应用程序电子邮件中?

    所以我有一段时间遇到这个问题但无法让它工作 我一直在构建一个调查应用程序 用户只需在其中输入信息并将其保存到 csv 文件中 我现在正处于需要将应用程序内的 csv 文件附加到电子邮件地址的阶段 我刚刚在我的新手机上测试了这个 收到电子邮件
  • 在 ipython 笔记本中测量单元执行时间的简单方法

    除了单元的原始输出之外 我还想获取单元执行所花费的时间 为此 我尝试了 timeit r1 n1但它不会公开单元格内定义的变量 time适用于仅包含 1 条语句的单元格 In 1 time 1 CPU times user 4 s sys
  • 为什么 UITableView 单元格在滚动时重叠?

    我有一个UITableView大约有 100 行 每个单元格都检查了图像 但是当我们滚动时UITableView 所有单元格在未检查的单元格中重叠 UITableViewCell tableView UITableView tableVie
  • 重载new和delete

    我尝试遵循这篇文章 http flipcode com archives How To Find Memory Leaks shtml http flipcode com archives How To Find Memory Leaks