gpt4 book ai didi

C++ 新建、删除、新建[] 和删除[]

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:17 28 4
gpt4 key购买 nike

我目前正在开发自己的内存泄漏跟踪系统。

我正在使用 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 造成严重破坏以下代码中的关键字。
  • 在 C 中你不应该转换 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com