c++ - 实现自定义 malloc() 能够跟踪 C++ 中的分配位置

标签 c++

我正在用 C++ 实现自定义内存管理系统以跟踪内存分配。我有一个在分配内存时使用的宏,如下所示:

void *p=MALLOC(1024);

这个宏调用了一个函数来分配内存,同时也为内存跟踪信息分配了一些额外的内存。在此内存跟踪信息中,我存储了有关 __FILE____LINE____FUNCTION__ 的信息,以便我知道分配发生的位置(以防出现泄漏) .但是,我想减少此内存跟踪信息的大小,并且对于每个分配都希望存储一个包含此信息的指针,而不是指向 __FILE____FUNCTION__ 的单独指针和 __LINE__。所以我考虑让宏定义如下:

struct malloc_info
{
    malloc_info(const char *file_, const char *func_, unsigned line_)
        :file(file_)
        ,func(func_)
        ,line(line_)
        {}
    const char *file;
    const char *func;
    const unsigned line;
};
#define MALLOC(size__) {static const malloc_info s_info(__FILE__, __FUNCTION__, __LINE__); my_custom_malloc(size__, s_info);}

但是,这不会启用我上面用于内存分配的语法 (void *p=MALLOC(1024);)。为了启用语法,我正在考虑使用模板函数为每个 MALLOC() 调用获取 malloc_info 并在模板函数内对 malloc_info 进行静态分配,但我不知道有什么可靠的方法可以为每个调用实例化该函数.我可以使用 __LINE__ 作为模板参数,但你可以在同一行上调用两个 MALLOC() 并且我听说有人在将 __LINE__ 作为模板参数传递时遇到问题,例如这是行不通的:

template<unsigned line>
static const malloc_info &get_malloc_info(const char *file_, const char *func_, unsigned line_)
{
    static const malloc_info s_info(file_, func_, line_);
    return s_info;
}
#define MALLOC(size__) my_custom_malloc(size__, get_malloc_info<__LINE__>(__FILE__, __FUNCTION__, __LINE__))

之前我只是构建了一个字符串文字,其中包含有关 malloc 位置的位置信息和存储的指向该字符串的指针,例如

#define MALLOC(size__) my_custom_malloc(size__, __FILE__" ("STR(__LINE__)") - "__FUNCTION__)

但是,当我将此代码从 MSVC 移植到 gcc 时,__FUNCTION__ 不再是字符串文字(而是在函数范围内静态分配的 c 字符串)因此我无法创建这样的连接字符串.

那么有人对如何解决这个问题有任何建议吗?

谢谢,Jarkko

最佳答案

我知道这有点 hacky 但我可以通过使用 __COUNTER__ 宏而不是作为模板函数参数传递的 __LINE__ 来实现健壮的实现,以确保函数为每个调用站点实例化。 __COUNTER__ 不是 C++ 标准的一部分(据我所知),但它受到我目前针对的编译器(gcc 和 MSVC)的支持。那么什么是可行的:

struct alloc_site_info
{
  alloc_site_info(const char *filename_, const char *funcname_, unsigned line_)
    :filename(filename_)
    ,funcname(funcname_)
    ,line(line_)
  {}
  const char *filename;
  const char *funcname;
  unsigned line;
};

template<unsigned>
static const alloc_site_info &get_alloc_site_info(const char *filename_, const char *funcname_, unsigned line_)
{
  static const alloc_site_info s_info(filename_, funcname_, line_);
  return s_info;
}

#define MALLOC(bytes__) my_alloc(bytes__, get_alloc_site_info<__COUNTER__>(__FILE__, __FUNCTION__, __LINE__));

这不是最漂亮的实现,但我目前知道的唯一可行的解​​决方案。

关于c++ - 实现自定义 malloc() 能够跟踪 C++ 中的分配位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24093473/

相关文章:

c++ - 确保仅从对象的创建线程调用方法

android - Cocos2d-x视差无限滚动错误

c++ - 二维数组,调用函数问题

c++ - 如何使用 ODBC 批量获取或插入行? (在 C 或 C++ 中)

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 计算斐波那契数的模板元编程

c++ - Erase-Increment 习语失败, 'vector iterator not compatible'

c# - 有人可以(很好地)解释为什么 OOP 方法重载是一件好事吗?

c++ - 检查 ofRay 是否与 ofMeshFace 相交

c++ - std::cout.imbue() 多次调用