使用重载的 new 和 delete 运算符跟踪已用内存



好的伙计们,所以我的目标是跟踪已分配的内存。为此,我创建了一个静态变量并重载了 new 和 delete 运算符。不过我有点困惑。当我创建新的 int 对象时,它会分配 4 个字节的内存,但是当我删除指向这个 int 的指针时,它说已删除 8 个字节。有没有办法准确地跟踪它?再往下走,我还想跟踪动态创建的对象并跟踪已为其使用了多少内存。这是我的代码:

#include<iostream>
#include<stdlib.h>
static int memory{0};
void* operator new(std::size_t sz){
    memory+= sz;
    return std::malloc(sz);
}
void operator delete(void* ptr) noexcept{
    memory-= sizeof(ptr);
    std::free(ptr);
}
int main()
{
    int * p = new int;
    *p = 2;
    std::cout << memory; // memory = 4
    delete p;
    std::cout << memory; // memory = -4 
}

有点烦人,不是吗? free知道有多少内存要释放,但不会告诉你。

实际的解决方案是向malloc请求添加额外的sizeof(size_t),并使用返回分配的第一个字节来存储sz。在 operator delete 中,您执行相反的操作:查找 ptr 前面的 sizeof(size_t) 个字节。

所以你会得到的代码是memory-=static_cast<size_t*>(prt)[-1]; .我知道,[-1]看起来很可怕。为数不多的有意义的情况之一。

你这里有一个错误的假设。 sizeof指针返回指针的大小,而不是它指向的结构的大小。因此,无论您分配哪种类型的结构(无论是int、类还是数组的实例(,您总是减去相同的内存量。

您应该检查指针指向的结构的大小,但在此代码中很难。由于您将void*作为参数传递,因此无法取消引用它,并且您必须知道该指针是什么类型。
我想您可以尝试使用模板函数来保留指针类型(并能够取消引用它(。

最新更新