c++ - 重载 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;
}
解决方案
您收到双重释放错误,因为您要删除指针p
两次:
operator delete(p, pool);
delete p;
推荐阅读
- macos - 使用 AppleScript 安排系统重启
- php - 在分配任务的前一天发送电子邮件
- python - 如何从 NavigationToolbar2Tk/FigureCanvasTkAgg 中删除工具栏按钮
- react-native - 无法在 react-native-reanimated-bottom-sheet 中滚动 Flatlist
- python - 如何从 tarfile 流式传输文件以供阅读?
- ios - 当我在 swift iOS 中垂直滚动时,Tableview 单元格数据正在发生变化
- gherkin - 在 BDD/gherkin 中,如何在可重用的后续步骤中使用部分结果
- angular - Nrwl NX:提供从应用程序到库的样式变量
- angular - 如何在角度上制作适当长度的 serach bar
- c# - C#如何停止控制台程序等待下一行的输入?