好的家伙所以我的目标是跟踪已分配的内存。为此,我创建了一个静态变量并重载了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
}
答案 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*
作为参数传递,因此您无法取消引用它,并且您必须知道该指针的类型。
我想你可以尝试使用模板函数来保留指针类型(并且能够取消引用它)。