gpt4 book ai didi

c++ - 在 crtdbg.h 导致冲突时覆盖 C++ 中的新运算符

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:35 26 4
gpt4 key购买 nike

在为我自己的内存管理器尝试一些内存跟踪和准备时,我试图覆盖 new 运算符。关于 flipcode 的文章是我在此过程中的主要指南 (http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml)。

在实现那篇文章中描述的技术之后,我留下了一个问题,即在 STL 的某处,“crtdbg.h”被直接或间接地通过一些被包含的头文件包含(使用 Visual Studio 2010)。

这会导致错误:

[...]10.0\vc\include\crtdbg.h(1078): error C2365: 'operator new' : redefinition; previous definition was 'function'
[...]10.0\vc\include\crtdbg.h(1078): error C2078: too many initializers
[...]

通过在不包含头文件的情况下放置“_CrtDumpMemoryLeaks()”进行快速检查证实了我的怀疑,即头文件确实包含在 STL 文件中。

// The header files that should be included for using the CrtDumpMemoryLeaks:
//#define _CRTDBG_MAP_ALLOC
//#include <stdlib.h>
//#include <crtdbg.h>
//...
_CrtDumpMemoryLeaks()

先不说实现我自己的新建/删除是否是个好主意,我想知道我如何才能拥有自己的新建/删除实现,同时仍然使用一些标准库功能并且没有这些重定义错误。


代码如下所示:

内存调试.h

#ifndef _MEM_DEBUG_H
#define _MEM_DEBUG_H

#ifdef _DEBUG
void * operator new( unsigned int size, const char *filename, int line );
void operator delete( void *ptr );

#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW
#endif

#endif

内存调试.c

#ifdef _DEBUG
void * operator new( unsigned int size, const char *filename, int line )
{
void *ptr = (void *)malloc(size);
//AddTrack((DWORD)ptr, size, filename, line);
return(ptr);
};

void operator delete( void *ptr )
{
//RemoveTrack( (DWORD)ptr );
free( ptr );
}
#endif

main.cpp

#include "memdebug.h"
#include <iostream>

void main()
{
Test *pTest = new Test();
std::cout << "end" << std::endl;
}

我解决它的方法是移动 #define new DEBUG_NEW<iostream> 下面;问题已解决,因为它不会重写 crtdbg.h 中的新内容;然而,这确实使得必须确保始终在包含 crtdbg.h 的可能 header 之后完成此操作变得很麻烦。文件。

我相信这只能通过为新运算符使用自定义名称并改用该名称来解决。我说得对吗?

最佳答案

好吧,我现在解决它的方法是,不必使用自定义"new"定义,我已经制作了一个通用头文件,假设每个文件中都包含“Engine.h”。这可以通过使用 Project Settings/Configuration Properties/C/C++/中的Forced Include File 来强制执行高级

此文件包含#define(从memdebug.h 中删除)

引擎.h

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#include <windows.h>

#include "MemoryNappy.h"

#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW

这会强制系统在自定义新定义之前考虑 crtdbg.h,并且不会在那里更改新的。第二次它被包含在某个地方,它只是使用之前已经加载的数据。 (在包含 <iostream> 之后包含 "engine.h" 的情况下)。

请注意,当使用可能执行相同操作的第三方库时,覆盖新运算符仍然存在风险。这会导致使用此处使用的模式重写这些文件的新运算符。在这种情况下,您可能需要重新考虑自定义新定义的使用,如以下片段所示:

#define myNew new(__FILE__, __LINE__)

(也在 http://www.flipcode.com/archives/Detecting_Memory_Leaks.shtml 中描述)

关于c++ - 在 crtdbg.h 导致冲突时覆盖 C++ 中的新运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5053382/

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