gpt4 book ai didi

c++ - 覆盖 "new"并记录有关调用者的数据

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

我正在尝试编写一个内存分析器,到目前为止已经能够让我的自定义函数为 malloc、free、new 和 delete 工作。我尝试使用 __FILE____LINE__ 将发起者记录在重载的新方法中,但(正如预期的那样)它只给出了重载函数所在位置的详细信息。有没有一种方法可以在不对被测试组件的现有代码进行任何更改的情况下获取有关重载函数的发起者的详细信息(例如 #define for malloc)?

我使用的函数是:

void* operator new (size_t size)
{
if(b_MemProfStarted)
{
b_MemProfStarted = false;
o_MemLogFile << "NEW: " << "| Caller: "<< __FILE__ << ":"
<< __LINE__ << endl;
b_MemProfStarted = true;
}

void *p=malloc(size);
if (p==0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior

return p;
}

bool b_MemProfStarted 用于避免递归调用 ofstream 和 map.insert。

最佳答案

你可以写

new(foo, bar) MyClass;

在这种情况下调用以下函数

void*operator new(std::size_t, Foo, Bar){
...
}

你现在可以调用

new(__LINE__, __FILE__) MyClass;

并将数据与

一起使用
void*operator new(std::size_t, unsigned line, const char*file){
...
}

添加宏

#define new new(__LINE__, __FILE__)

被监视的代码将捕获大多数调用,而无需更改源代码。

它并不完美,例如您可以直接调用 operator new。在那种情况下,预处理器会将您的代码变成垃圾。不过,我知道没有更好的方法。

关于c++ - 覆盖 "new"并记录有关调用者的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1395202/

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