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

时间:2018-04-12 07:48:55

标签: c++

好的家伙所以我的目标是跟踪已分配的内存。为此,我创建了一个静态变量并重载了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 
}

2 个答案:

答案 0 :(得分:2)

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

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

所以你得到的代码是memory-=static_cast<size_t*>(prt)[-1];。我知道,[-1]看起来很可怕。少数几个有意义的案例之一。

答案 1 :(得分:-1)

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

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