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

C++ 使用重载的new和delete运算符跟踪已用内存?,c++,C++,好了,伙计们,我的目标是跟踪已经分配的内存。为此,我创建了一个静态变量并重载了new和delete操作符。不过我有点困惑。当我创建新的int对象时,它会分配4个字节的内存,但是当我删除指向这个int的指针时,它会说已经删除了8个字节。有没有办法精确地跟踪它?接下来,我还想跟踪动态创建的对象,并跟踪它使用了多少内存。 这是我的密码: #include<iostream> #include<stdlib.h> static int memory{0}; void* ope

好了,伙计们,我的目标是跟踪已经分配的内存。为此,我创建了一个静态变量并重载了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 
}
#包括
#包括
静态int内存{0};
void*运算符新(标准::大小\u t sz){
存储器+=sz;
返回标准::malloc(sz);
}
无效运算符删除(void*ptr)无例外{
存储器-=sizeof(ptr);
标准:免费(ptr);
}
int main()
{
int*p=新的int;
*p=2;

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

您应该检查指针指向的结构的大小,但在这段代码中这很难。因为您将
void*
作为参数传递,所以无法取消引用它,您必须知道该指针的类型。

我想您可以尝试使用模板函数来保留指针类型(并能够取消引用它)。

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

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


因此,你会得到的代码位是
内存-=static_cast(prt)[-1];
[-1]
看起来很可怕,我知道。这是少数几个有意义的情况之一。

这可能是一种竞争条件。对内存使用原子变量尝试同样的方法。sizeof(ptr)不是分配的数量,而是指针的大小(x64上的8字节)@davidhigh:只有一个线程。您可以分配更多线程来保存返回指针附近的大小。注意对齐。尝试重载(5)in:是的,我怎么会错过呢?我想我必须重新考虑delete操作符重载。实际上,你很清楚指针的类型。它是从
操作符new
返回的。你错过了
操作符new/operator delete
对的要点;它们是齐头并进的。@MSalters-hmm…我想我可以c将新运算符中的行更改为memory+=sizeof(std::malloc(sz))而不是memory+=sz@DerekJohnson:当然可以,但是
sizeof(malloc)
可能是4或8(32或64位系统),因此您可以有效地计算分配的数量。这要简单得多。