首页 > 解决方案 > 如何正确跟踪 C++ 中的内存分配和释放,并重载运算符新闻和运算符删除?

问题描述

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

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

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

大小在运行时适当填充。我使用 p1 和 p2 来索引一个二维数组,在该数组中,我将当前使用的内存分配增加为 (p1,p2) 和“大小”。就像是2dArray[p1][p2].increment_current_bytes(size);

现在,我的问题是,当我使用放置删除时,我如何知道要释放的内存大小?我需要知道它以相应地更新二维数组。试着写这个 -

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

不起作用,因为 C++ 中没有提供这样的运算符 delete。它希望我填写 size 作为对 operator delete 函数的显式调用的一部分。

参考 - https://en.cppreference.com/w/cpp/memory/new/operator_delete

标签: c++operator-overloadingnew-operatordelete-operatorplacement-new

解决方案


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

使用记录表,您基本上将所有分配存储在哈希表之类的东西中。new调用时,将结果指针与分配大小一起存储在该表中。当delete被调用时,只需在表中查找该指针以获取大小并随后将其删除。

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


推荐阅读