Malloc 宏重载也适用于编译器对 malloc (C++) 的调用?

Malloc macro overloading that works also for compiler calls to malloc (C++)?

提问人:blipblop 提问时间:3/21/2017 更新时间:3/21/2017 访问量:511

问:

我在网上多次提到以下技巧来“重载”对“malloc”的调用:

void* myMalloc(const char* file, int line, size_t size)
{
    return malloc(size);
}
#define malloc(X) myMalloc( __FILE__, __LINE__, (X) )

但是,它是否也影响编译器对程序员显式调用的隐式调用,或者仅影响程序员显式调用?有没有办法使它重载,甚至自动调用也会使用修改后的版本?mallocmalloc

我问是因为我尝试了以下方法,但没有成功:

#include <iostream>
#include <malloc.h>

int usedMem(0);

void* myMalloc(const char* file, int line, size_t size)
{
    usedMem += size;
    return malloc(size);
}
#define malloc(X) myMalloc( __FILE__, __LINE__, (X) )

int main(void)
{
    int *mydata = new int[5000];
    for (size_t i = 0; i < 5000; i++)
    {
        mydata [i] = 1;
    }

    std::cout << usedMem << std::endl;

    return 0;
}

我的输出返回零。也就是说,内存未使用 分配。有没有办法实现这一目标?usedMemmyMalloc

C++ 内存 malloc 分析

评论

0赞 MrEricSir 3/21/2017
无法保证接线员在引擎盖下拨打电话。即使有,你的方法也只会影响你自己调用 .如果要重定向调用以在低级别分配内存,则需要找出操作系统内核中的哪个函数用于分配内存,并通过某种类型的 API 钩子重定向内存 - 所有这些都是特定于平台的。newmalloc()malloc()
0赞 blipblop 3/21/2017
@MrEricSir谢谢。看完你的评论后,我搜索了一下。你知道钩子是否允许我正确识别调用 malloc 的函数吗?我只看到提到捕获文件和代码行的钩子。
0赞 MrEricSir 3/21/2017
你需要更仔细地研究,API 钩子与“捕获文件”或代码行完全无关。
0赞 blipblop 3/22/2017
@MrEricSir我认为我表达错了。我的意思是“识别”哪一行,在哪个文件中,调用了 malloc。钩子似乎是这样做的: msdn.microsoft.com/en-us/library/cy8c7wz5.aspx 然后,我要问的是,是否也可以使用钩子识别哪个函数称为 malloc

答:

1赞 user253751 3/21/2017 #1

但是,它是否也影响编译器对 malloc 的隐式调用,还是仅影响程序员显式调用?

只有程序员显式发出的调用。它还将破坏任何名为 的成员函数。malloc

有没有办法使它重载,即使是对 malloc 的自动调用也会使用修改后的版本?

宏则不然。

评论

0赞 blipblop 3/21/2017
我怀疑宏是可能的。您能否大致指出还有哪些其他解决方案可以实现这一目标?我的意思是,所以我可以进行研究并开始学习/关注这些方法?谢谢!
0赞 blipblop 3/21/2017
特别是,我对可能允许我检索分配内存的函数名称的方法特别感兴趣(而不仅仅是程序员的显式调用)。malloc
0赞 MrEricSir 3/21/2017
@blipblop宏只能替换代码,而不能替换预编译的二进制文件,例如 C++ 标准库。请参阅我对原始问题的评论,以获取有关重定向调用以分配内存的建议。