C++ 如何在C+中正确跟踪内存分配和释放+;重载到操作员新闻和操作员删除?

C++ 如何在C+中正确跟踪内存分配和释放+;重载到操作员新闻和操作员删除?,c++,operator-overloading,new-operator,delete-operator,placement-new,C++,Operator Overloading,New Operator,Delete Operator,Placement New,要求:跟踪分配和删除。每个分配都由两个参数标识,现在我们称它们为P1和P2 我使用带有两个附加参数的全局重载放置新运算符 void * operator new(size_t size, parameter_1_t p1, parameter_2_t p2); 大小在运行时适当填充。我使用p1和p2索引到一个二维数组中,在该数组中,我增加了内存分配的当前使用量,这些内存分配被分类为(p1,p2)和“size”。 类似于2dArray[p1][p2]。增加当前字节(大小) 现在,我的问题是,当我

要求:跟踪分配和删除。每个分配都由两个参数标识,现在我们称它们为P1和P2

我使用带有两个附加参数的全局重载放置新运算符

void * operator new(size_t size, parameter_1_t p1, parameter_2_t p2);
大小在运行时适当填充。我使用p1和p2索引到一个二维数组中,在该数组中,我增加了内存分配的当前使用量,这些内存分配被分类为(p1,p2)和“size”。 类似于
2dArray[p1][p2]。增加当前字节(大小)

现在,我的问题是,当我使用placement delete时,如何知道要释放的内存大小?我需要知道它来相应地更新二维阵列。 我试着写这个-

void * operator delete(void* ptr, size_t size, parameter_1_t p1, parameter_2_t p2);

不起作用,因为C++中没有这样的操作符删除。它希望我在显式调用operator delete函数时填写大小


参考-

操作员删除只需要分配的指针。由分配库使用私有结构来存储分配的大小。例如,对于各种内部管理变量,通常会分配比请求的稍多的内存,并在返回指针之前使用初始内存。尝试检测堆损坏的版本还将在内存区域返回给调用方后放置一个副本(实际上分配了请求的大小加上两倍的保管大小),并在取消分配时控制两个区域仍然包含相同的信息


如果你有特殊的要求,使用特殊的参数,你可以使用由返回的指针索引的映射,或者模拟标准库,并在分配的块中使用私有区域。

这是因为C++没有跟踪分配的内存大小。你得自己记账。我想到的两个选项是记录表或内存前缀

对于记录表,您基本上将所有分配存储在类似哈希表的内容中。调用
new
时,将生成的指针与分配大小一起存储在该表中。调用
delete
时,只需在表中查找该指针即可获得大小,然后将其删除

使用前缀,您必须分配比实际请求的内存更多的内存。然后将缓冲区的大小存储在前N个字节中,并在N个字节后返回指向内存的指针。例如,如果用户请求20个字节,则分配28个字节(N=8),并将请求的大小20存储在前8个字节中。然后返回指向剩余20个字节的指针。 在
delete
上,读取给定指针前的8个字节,以恢复块大小。

如何知道要释放的内存大小?--我想你需要一个更健壮的东西来保存尺寸信息。在调用
new
之后,是否将
size
信息扔掉?像
valgrind
这样的工具是如何工作的?