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;