gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:28 27 4
gpt4 key购买 nike

我正在用 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/

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