gperftools 中的明显内存泄漏
Apparent memory leak in gperftools
当 运行 一个使用地址清理程序构建的程序让我感到好奇时,就会出现这个问题。
The gperftools source code 包含以下函数:
void MallocExtension::Register(MallocExtension* implementation) {
InitModule();
// When running under valgrind, our custom malloc is replaced with
// valgrind's one and malloc extensions will not work. (Note:
// callers should be responsible for checking that they are the
// malloc that is really being run, before calling Register. This
// is just here as an extra sanity check.)
if (!RunningOnValgrind()) {
current_instance = implementation;
}
}
与InitModule
定义如下
static void InitModule() {
if (current_instance != NULL) {
return;
}
current_instance = new MallocExtension; // pointless?
#ifndef NO_HEAP_CHECK
HeapLeakChecker::IgnoreObject(current_instance);
#endif
}
我们的地址清理程序(当然不是 valgrind)抱怨 MallocExtension
对象的内存泄漏。显然,这是对的。但是为什么这个分配首先在那里?
我不认为开发自己的内存分配器的人会犯这种微不足道的错误。还有一个针对 valgrind 的显式检查。那么分配的目的是什么?
是的,在各种 google 代码(即不仅仅是 gperftools)中故意泄漏在启动时分配的单例对象是很常见的。思路既不是初始化也不是销毁顺序是明确的。因此,试图在进程关闭时释放此类单例是要求各种超级难以跟踪的问题。
更多信息:https://google.github.io/styleguide/cppguide.html#Static_and_Global_Variables
当 运行 一个使用地址清理程序构建的程序让我感到好奇时,就会出现这个问题。
The gperftools source code 包含以下函数:
void MallocExtension::Register(MallocExtension* implementation) {
InitModule();
// When running under valgrind, our custom malloc is replaced with
// valgrind's one and malloc extensions will not work. (Note:
// callers should be responsible for checking that they are the
// malloc that is really being run, before calling Register. This
// is just here as an extra sanity check.)
if (!RunningOnValgrind()) {
current_instance = implementation;
}
}
与InitModule
定义如下
static void InitModule() {
if (current_instance != NULL) {
return;
}
current_instance = new MallocExtension; // pointless?
#ifndef NO_HEAP_CHECK
HeapLeakChecker::IgnoreObject(current_instance);
#endif
}
我们的地址清理程序(当然不是 valgrind)抱怨 MallocExtension
对象的内存泄漏。显然,这是对的。但是为什么这个分配首先在那里?
我不认为开发自己的内存分配器的人会犯这种微不足道的错误。还有一个针对 valgrind 的显式检查。那么分配的目的是什么?
是的,在各种 google 代码(即不仅仅是 gperftools)中故意泄漏在启动时分配的单例对象是很常见的。思路既不是初始化也不是销毁顺序是明确的。因此,试图在进程关闭时释放此类单例是要求各种超级难以跟踪的问题。
更多信息:https://google.github.io/styleguide/cppguide.html#Static_and_Global_Variables