重载 new 和 delete 会导致 valgrind 错误

overload new and delete causes valgrind errors

本文关键字:valgrind 错误 new delete 重载      更新时间:2023-10-16

Valgrind 在抱怨这段代码,我真的不明白为什么?

==9144==ERROR: AddressSanitizer: attempting double-free on 0x60200000eff0 in thread T0:

完整日志

我正在为我的代码使用自定义异体,但下面是它的较短版本,它显示了相同的症状。如果我在嵌入式系统上运行,那么我不需要释放内存,但我总是想确保在基于 x86 的系统上运行时我没有泄漏任何内存,并且我正在使用 valgrind 来验证这一点。

/*
g++ test.cpp -fsanitize=address -fno-omit-frame-pointer
./a.out
*/
#include <iostream>                                                                                                                                                                                        
class TestMemoryPool{                                                                                                                                                                                      
};                                                                                                                                                                                                         
void* operator new(size_t n, TestMemoryPool* pool)                                                                                                                                                         
{                
#ifdef CUSTOM_ALLOCATER
//snip
#else                                                                                                                                                                                                                                                                                                                                                             
void *tmp = ::operator new(n);                                                                                                                                                                         
return tmp;  
#endif                                                                                                                                                                                          
}                                                                                                                                                                                                          
void* operator new[](size_t n , TestMemoryPool* pool)                                                                                                                                                      
{         
#ifdef CUSTOM_ALLOCATER
//snip
#else                                                                                                                                                                                                                                                                                                                                                                      
void *tmp = ::operator new(n);                                                                                                                                                                         
return tmp;   
#endif                                                                                                                                                                                         
}                                                                                                                                                                                                          
void operator delete(void* ptr, TestMemoryPool* pool)                                                                                                                                                      
{         
#ifdef CUSTOM_ALLOCATER
//snip
#else                                                                                                                                                                                                                                                                                                                                                                      
::operator delete(ptr);       
#endif                                                                                                                                                                         
}                                                                                                                                                                                                          
void operator delete[](void* ptr , TestMemoryPool* pool)                                                                                                                                                   
{          
#ifdef CUSTOM_ALLOCATER
//snip
#else                                                                                                                                                                                                                                                                                                                                                                  
::operator delete(ptr);   
#endif                                                                                                                                                                             
}                                                                                                                                                                                                          
int main()                                                                                                                                                                                                 
{                                                                                                                                                                                                          
TestMemoryPool *pool;                                                                                                                                                                                  
float *signalGen = new (pool) float[100];                                                                                                                                                              
TestMemoryPool *p = new (pool) TestMemoryPool();                                                                                                                                                       
operator delete[](signalGen, pool);                                                                                                                                                                    
operator delete(p, pool);                                                                                                                                                                              
delete p;                                                                                                                                                                                              
}     

您收到双重释放错误,因为您删除指针p两次:

operator delete(p, pool);
delete p;