重载 new 和 delete 会导致 valgrind 错误
overload new and delete causes valgrind errors
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;
相关文章:
- 重载 new 和 delete 会导致 valgrind 错误
- 我如何理解我的Valgrind错误消息
- Valgrind 错误和内存泄漏与 Python/C API
- 将TopoDS_Face对象分配给其子对象编译没有错误,但我有 3 个 valgrind 错误
- valgrind错误无效读数4
- C++ mac OS X El Capitan上的openmp,Valgrind错误(数据竞赛)
- Valgrind 错误:系统调用参数 epoll_pwait(sigmask) 指向不可寻址的字节
- Gtest使用C++11 std::condition_variable表示valgrind错误
- Valgrind错误链接列表
- 这个valgrind错误是什么意思
- BIO_dump_fp导致数百个valgrind错误
- 带字符串的strdup会导致valgrind错误
- 线程 1 中的堆栈溢出:无法将堆栈增长到 0xffe601ff8 Valgrind 错误
- boost::regex_search并替换valgrind错误
- 当我插入地图时,会出现Valgrind错误
- 不同操作系统的Valgrind错误不同
- Valgrind错误的原因是什么
- 文件读写会产生valgrind错误
- 如何使用析构函数清除链表内存,而不会出现valgrind错误?[更新:操作员过载帮助]
- 解释valgrind错误