c++ - 如何正确跟踪 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++ 不跟踪分配的内存大小。你必须自己记账。我想到的两个选项是记录表或内存前缀。
使用记录表,您基本上将所有分配存储在哈希表之类的东西中。new
调用时,将结果指针与分配大小一起存储在该表中。当delete
被调用时,只需在表中查找该指针以获取大小并随后将其删除。
使用前缀,您必须分配比实际请求更多的内存。然后将缓冲区的大小存储在前 N 个字节中,并在 N 个字节后返回指向内存的指针。例如,如果用户请求 20 个字节,您分配 28 个字节 (N = 8) 并将请求的大小 20 存储在前 8 个字节中。然后返回一个指向剩余 20 个字节的指针。delete
然后,您读取给定指针之前的 8 个字节以获取块大小。
推荐阅读
- ruby - 浮点数 - 逗号后两位数 - 如何?
- django - Django:如何在生产中的 apache 服务器上部署静态文件
- bash - 从 docker 容器获取命令执行结果
- java - 无法解析方法“List.of(java.lang.String, java.lang.String)”
- css - 是否可以在一行中有 flex-start、flex center 和 flex-end
- python - 计算边界框的面积
- json - 如何将此 json 文件转换为 pandas 数据框
- node.js - 如何从父目录导入 npm 模块?
- ionic-framework - 更改颜色和字体大小图标 Ion-toolbar
- scala - 在scala中将一个列表元素与第二个列表列表结合起来