微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐