c – 使用参数覆盖删除

我可以使用不同的参数覆盖全局operator new,例如我可以:
void* operator new (std::size_t size) throw (std::bad_alloc);
void* operator new (std::size_t size,int num) throw (std::bad_alloc);

可以单独调用

int* p1 = new int; // calls new(size_t)
int* p2 = new(5) int; // calls new(size_t,int)

由于每个都可能使用一些不同的分配方案,我需要为每个分配方案单独的delete()函数.但是,delete(void *)不能以相同的方式重载! delete(void *)是唯一有效的签名.那么如何处理上述情况呢?

附:我并不是说这是一个好主意.这种事情发生在我身上,所以我在c中发现了这个“缺陷”(至少在我看来).如果语言允许新的覆盖,则必须允许删除覆盖,否则它将变得无用.所以我想知道是否有办法解决这个问题,而不是这个好主意.

解决方法

如果您跟踪使用不同的新重载分配的不同内存区域,则可以使用调用的新版本标记它们.

然后在删除时,您可以查看地址以查找调用的新内容,并在每种情况下执行不同的操作.

这样,您可以保证正确的逻辑自动与每个不同的新过载相关联.

正如baruch在下面的评论中指出的那样,维护用于跟踪的数据会产生性能开销,并且只要重载的删除未通过使用删除分配的任何内容,此逻辑也将起作用.

就跟踪开销而言,在我看来,跟踪分配类型的最小开销方法是分配请求的数量,以及在分配区域的开始处添加少量额外空间来标记请求类型(根据保守的对齐要求确定尺寸).然后,您可以在删除时查看此标记区域以确定要遵循的逻辑.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...