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