首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载新的和删除会导致计算错误

重载新的和删除会导致计算错误
EN

Stack Overflow用户
提问于 2020-06-04 07:50:05
回答 1查看 125关注 0票数 0

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

代码语言:javascript
复制
==9144==ERROR: AddressSanitizer: attempting double-free on 0x60200000eff0 in thread T0:

日志

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

代码语言:javascript
复制
/*
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;                                                                                                                                                                                              
 }     
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-04 08:13:17

因为要删除指针p两次,所以您获得了双重自由错误:

代码语言:javascript
复制
operator delete(p, pool);
delete p;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62189453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档