首页 > 解决方案 > 重载 new 和 delete 导致 valgrind 错误

问题描述

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;                                                                                                                                                                                              
 }     

标签: c++valgrind

解决方案


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

operator delete(p, pool);
delete p;

推荐阅读