【发布时间】:2021-06-19 05:40:33
【问题描述】:
我试图找出分配的总内存,然后由我的程序释放,以通过重载 new 和 delete 运算符来确定是否存在任何内存泄漏。下面是new和delete的重载方法:
void* operator new(size_t sz)
{
void* m = (void*) MemoryManager::getInstance()->allocate(sz, false);
if(!m){
throw std::bad_alloc{};
}
return m;
}
// Overloading Global delete operator
void operator delete(void* m) noexcept
{
MemoryManager::getInstance()->deallocate(m, false);
}
new 和 delete 调用的 allocate 和 deallocate 方法定义如下:
PointerType allocate(size_t size, bool isArray){
PointerType newPtr = (PointerType)std::malloc(size);
mMemKeeper[newPtr] = size;
mBytes += size;
return newPtr;
}
void MemoryManager::deallocate(void* pt, bool isArray){
LockGuard lck(mGateKeeper);
if(mMemKeeper.find((PointerType)pt) != mMemKeeper.end()){
mBytes -= mMemKeeper[(PointerType)pt];
mMemKeeper.erase((PointerType)pt);
std::free(pt);
}
}
typedef char* PointerType;
typedef std::unordered_map<PointerType, MemoryInfo,
std::hash<PointerType>, std::equal_to<PointerType>,
my_allocator<std::pair<const PointerType, MemoryInfo> > > OrderedMap;
OrderedMap mMemKeeper;
我面临的问题是在访问mMemKeeper.find((PointerType)pt) 时解除分配。似乎指针pt 在到达此处时已经被释放,并且取消引用它会导致问题。什么时候会发生这种情况?有什么方法可以检测pt 的内存是否已被释放?
【问题讨论】:
-
当 Visual Studio 发生此问题时,我尝试访问指针的内存位置,它显示 00 00 00 00 00 00,我认为这意味着内存已被释放
-
我认为这意味着内存已被释放没有 Visual Studio 有不同的代码。相关:https://stackoverflow.com/questions/127386/in-visual-studio-c-what-are-the-memory-allocation-representations
-
考虑不要这样做,除非你这样做是为了运动/娱乐/学习。已经有多种专门的工具用于检测内存泄漏
-
你能提供一个minimal reproducible example吗?此外,您的
deallocate函数正在搜索地图三次! 1.mMemKeeper.find(...)2.mMemKeeper[...]3.mMemKeeper.erase(...).改为 1.auto it = mMemKeeper.find(...)2.it->second3.mMemKeeper.erase(it)。 -
您总是可以在缓冲区前后分配一个额外的空间,并在其中放入一个幻数,这对于检测溢出也很有用。
标签: c++ malloc new-operator free delete-operator