【问题标题】:Overriding malloc to log allocation size覆盖 malloc 以记录分配大小
【发布时间】:2012-03-14 12:49:05
【问题描述】:

我正在尝试使用一些代码在 tcpdump 中为我的一个项目记录 malloc,我正在使用的代码如下:

#include <stdlib.h>


unsigned int memCount = 0;

void *my_malloc(size_t size) {
void *p = malloc(size);
memCount = memCount + size;
printf("Memory Allocated :%u \n", size
return p;
}

#define malloc(size) my_malloc(size)

在网上查看了许多类似的问题之后,这似乎应该可以工作,但是我的自定义 malloc 似乎没有被调用。任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 您是在代码中覆盖malloc 还是已经编译的代码?另外,请确保您的宏是在全局级别定义的,每次使用 malloc 都可见

标签: c malloc


【解决方案1】:

您必须再次#define 每个源文件中的 malloc 宏 - 因此通过包含定义宏的头文件来完成。

【讨论】:

  • 这不是问题。问题是my_malloc 最终会调用自己。
  • 这不是 OP 所要求的,抱歉。但是,只是不要 #include 定义 my_malloc() 的源文件中的那个头文件,而是 #include stdlib.h 文件。另请注意,您必须包含重新定义malloc() stdlib.h 之后的头文件。
【解决方案2】:

您的问题是,当您期望调用真正的 malloc 时,您的 my_malloc 会调用您的 #define for malloc。原因是预处理器还将其中的malloc 转换为my_malloc

如果我们简单地预处理以下内容:

#define malloc(size) my_malloc(size)

unsigned int memCount = 0;

void *my_malloc(size_t size) {
  void *p = malloc(size);
  memCount = memCount + size;
  printf("Memory Allocated :%zu \n", size);
  return p;
}

int main(void) {
  malloc(123);
  return EXIT_SUCCESS;
}

你实际上会得到:

unsigned int memCount = 0;

void *my_malloc(size_t size) {
  void *p = my_malloc(size);
  memCount = memCount + size;
  printf("Memory Allocated :%zu \n", size);
  return p;
}

int main(void) {
  my_malloc(123);
  return 0;
}

你需要访问真实的malloc,演示为here

【讨论】:

    【解决方案3】:

    应该,您可能没有让define 对您实际使用malloc 的文件可见。将它放在一个公共标头中,该标头包含在您的所有实现文件中。

    编辑:如果问题是函数调用自身,您应该将define 移到函数声明之后。

    【讨论】:

    • malloc 不是一个关键字,它是一个函数名,如果你覆盖默认的 RT,你可以随意替换它
    • malloc 是库函数的名称,而不是关键字。
    • malloc 不是关键字(保留标识符),但我想它可能被实现为另一个标识符(#define malloc __Malloc)的宏。
    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2010-10-26
    • 1970-01-01
    • 2011-12-23
    相关资源
    最近更新 更多