- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在开发自己的内存泄漏跟踪系统。
我正在使用 Microsoft Visual C++ 2008,我知道他们有一个内置的,但我一直在为自己制作一个,只是为了好玩。
但是,当我覆盖 new 和 new[] 命令时,无论我做什么,都会出现函数重定义错误。
我不太了解 Microsoft Visual C++ 的内部绑定(bind),但我听说 CRT 已经定义了与我完全相同的宏。
我在这里和其他地方看到过针对同一个问题的文章,但是人们似乎永远无法解决问题或永远无法就他们如何解决问题给出明确的答案解决了。
这是我到目前为止的所有代码:
MLD.h:http://pastebin.com/SfHzNaeNMLD.cpp:http://pastebin.com/aRhsTZpv
所有代码都松散地基于一篇旧的 flipcode 文章(如何检测内存泄漏)。抱歉,我不能给你一个直接链接,因为我没有 10 个代表发布超过 2 个超链接。
感谢您的宝贵时间。
最佳答案
“函数重新定义错误”可能是因为您使用的是 MFC。
运行时库不应负责定义此类分配和释放函数。
当前代码的
struct MemLeakInfo
{
unsigned int addr;
unsigned int line;
unsigned int size;
unsigned char file;
};
不好。一个unsigned int
不能保证足够大以容纳地址,即使它在 32 位 Windows 中也是如此。相反,使用 intptr_t
.
此外,当前代码的
void* operator new(unsigned int Size, int Line, const char* File);
不好。那应该是……
void* operator new( size_t Size, int Line, const char* File );
而你需要一个对应的operator delete
,就像……
void* operator delete( void* p, int Line, const char* File );
为了从失败的构造函数调用中释放内存。只有在非常特殊的情况下才会调用它。但如果你没有它,那么你就会有泄漏,就像 MFC 曾经用于调试构建一样。
文件 [minimal.h]:
_MINIMAL_H
无效,因为它以下划线开头,后跟大写字母,这是保留的。改为MINIMAL_H
.size_t
你需要包括 <stddef.h>
._DEBUG
不是标准的宏。这是微软主义。用于此目的的标准宏(查找 assert
的文档)是 NDEBUG
.
#ifndef MINIMAL_H
#define MINIMAL_H
#include <stddef.h> // std::size_t
#ifndef NDEBUG
void* operator new( size_t Size, int Line, const char* File );
void* operator new[]( size_t Size, int Line, const char* File );
void operator delete( void* ptr, int Line, const char* File );
void operator delete[]( void* ptr, int Line, const char* File );
#endif
#ifndef NDEBUG
#define DEBUG_NEW new( __LINE__, __FILE__ )
#else
#define DEBUG_NEW new
#endif
#endif //MINIMAL_H
文件[最小.cpp]:
malloc
你需要包括 stdlib.h
.#define new
你正在对 new
造成严重破坏以下代码中的关键字。malloc
的结果,而在 C++ 中,你应该只在需要时才进行转换。这里没有这样的需要。仅转换掩码错误,这不是一个好主意。throw std::bad_alloc
.这是按照神圣标准对这些功能的规范。
#include "Minimal.h"
//#define new DEBUG_NEW
#ifndef NDEBUG
#include <stdlib.h> // malloc
#include <exception> // std::bad_alloc
void* operator new( size_t const size, int, const char*)
{
void* const ptr = malloc( size );
if( !ptr ) { throw std::bad_alloc(); }
return ptr;
};
void* operator new[]( size_t const size, int, const char*)
{
void* const ptr = malloc( size );
if( !ptr ) { throw std::bad_alloc(); }
return ptr;
}
void operator delete(void* const ptr, int, const char*)
{
free( ptr );
};
void operator delete[]( void* const ptr, int, const char* )
{
free( ptr );
};
#endif
关于C++ 新建、删除、新建[] 和删除[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10674495/
我目前正在开发自己的内存泄漏跟踪系统。 我正在使用 Microsoft Visual C++ 2008,我知道他们有一个内置的,但我一直在为自己制作一个,只是为了好玩。 但是,当我覆盖 new 和 n
在我的库(替换全局 new/delete 运算符)中,我使用另一个外部库(casablanca pplx)。此外部库不包含替换的 new/delete 运算符(我使用 Visual Studio 的
最近的 C++ 标准中的内存分配操作是否有复杂性保证?也就是说,如果我有一个类 A,其默认构造函数和析构函数在 O(1) 中运行,那么“new A[N]”和“delete[] A”的 big-O 是什
我正在用 Qt 和 C++ 编写一个简单的编辑器。我想要有标签,所以在创建新文档后,我想在新标签中打开它。我的代码: // mainwindow.cpp #include "mainwindow.h"
好吧,这让我感到困惑...下面的代码在一个 DLL 中,当我的控制台应用程序调用这段代码时,它突然在 delete[] lpBuffer 行抛出访问冲突。我整天都在使用这段代码,根本没有改变它。到目前
我现在很头疼。 基本上我有这个: Class A -> Class B Class A -> Class C Class A -> Class D Class E with constructor w
我想通过将一个表 (tableA) 与另一个表 (tableB) 进行比较来查找新的、修改的和删除的记录。两个表具有相同的模式并具有唯一的 ID 字段。 在我的情况下,tableA 最初与 table
这是我们的商业案例, 应用程序为使用过的 iPhone 提供即时报价,并允许卖家立即出售。另一方面,有些买家愿意立即购买或竞标房源。潜在的零售商可以访问网站并根据年份、型号、状况、配件输入获得即时报价
需要一些帮助。设法创建一个 jQuery 来在单击后更改按钮的类,但我需要您单击一个从其他按钮中删除的新按钮类。 我正在努力,但我做不到。我已经尝试了一些方法,但每当我尝试时,我都可以删除所有内容并单
为什么“创建 Java 项目”屏幕中有时会缺少“内容”部分(带有“从现有源创建项目”选项)?我知道我以前见过并使用过它,但现在它已经消失了。 最佳答案 您最好在 Eclipse JDT 论坛上提出这个
我写了下面的代码 1. function Car() { this.make = "BMW" } var x = new Car().make alert(x) 结果:显示警报 BMW 2. fu
我正在使用 wxPython 为 python 应用程序编写 UI。我已经处理了一些 OnX 函数,但我需要 OnNew 和 OnSave/SaveAs 方面的帮助 这是我的保存和另存为代码: def
每当我尝试创建一个新的 Win32 控制台应用程序或 Win32 项目时,Win32 应用程序向导弹出,项目设置项目符号点为空,并且无法单击“应用程序设置”、“完成”和“取消”按钮. 当我搜索与我类似
我创建了一个扩展点 newWizard,并在那里添加了向导(比方说 Wizard1、Wizard2、Wizard3)。我创建了一个视角,即 perspectiv1。当我创建插件项目时,所有向导标签都会
新建 >> 项目 >> Android 应用程序 项目不起作用我收到这些消息: Problem Opening Wizard The selected wizard could not be star
#include #include using namespace std; int main(void) { unsigned char* pFoo = new unsigned cha
谁能帮我理解为什么我的代码在第一段代码中的 delete[] szPassword 上失败?我知道 szPassword 只是复制“a”,而 st2 等于 8: TCHAR *szPassword =
伙计们,如果我在我的 dll 代码中覆盖全局新建和删除,这会覆盖用户代码新建和删除吗?我做了一个测试,显示用户new和delete不会受到影响。如果我想让用户代码new和delete被我的sdk ne
编译 in_ 表达式的默认 SQLAlchemy 行为对于非常大的列表来说是病态的,我想为运算符创建一个自定义的、更快的编译器。如果解决方案是一个新的运算符(即:in_list_)或者它是否覆盖了 i
new 和 delete 被称为预处理器,而 malloc 和 free 是函数。 new 和 delete 是预处理器是什么意思? 最佳答案 new 和 delete 是 C++ 运算符(如 +、(
我是一名优秀的程序员,十分优秀!