“函数重新定义错误”可能是因为您使用的是 MFC。
运行时库不应负责定义此类分配和解除分配功能。
当前代码的
struct MemLeakInfo
{
unsigned int addr;
unsigned int line;
unsigned int size;
unsigned char file;
};
不好。unsigned int
即使在 32 位 Windows 中,也不能保证An足够大以容纳地址。相反,使用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
文件 [minimal.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