C++中new和delete

这次因为项目被划分成多个dll模块,而且在某个dll模块中new出来的内存块可能会穿越其他的dll,最后可能不是在它出生的那个dll中被销毁,这会导致内存分配回收出现问题。

考虑了一下,决定由一个dll模块单独的维护内存申请和释放,其他任何需要动态申请内存的模块都调用该dll中的接口即可。不过在实际操作中,有一点点问题:

我本来是希望在dll中重载好new和delete,这样其他模块只要和dll链接就可以,最大限度复用代码。

但是实际上实验下来是不行的。new重载后公开为导出函数倒是没问题,但是delete就不行了。因为全局delete不能有其他参数(不像new,new 你在遵守规则的前提下可以随意重载),所以在公开为导出的时候会因为有重复定义而链接失败,目前还没有好的解决办法,以我所了解的,可能这个问题还真没办法。只能由dll进行内存管理,所有的模块都有公共使用一组重载new/delete的源码文件了,这样new/delete的重载代码就没法做到dll库中了。这样也不是不可以,只是可能有点不够优雅吧。

另外在记录一点想法: 在分配长度为N的内存时,实际分配N+M个字节,M个字节用来做一些cookies工作,记录下长度和标志,为内存管理做好准备,另外也可以在后面加上标志,这样可以检测是否有回收不正确内存,或者作为将来对内存泄露问题的诊断依据。

最后记2个小问题:

new 和 delete重载的概念问题: 首先,new和delete本身是不能被重载的,你并不能改变new和delete的原生语义,你所能重载的,其实是 operator new和operator delete, 注意了,这只是两个操作符而已。但是由于名字的缘故,导致我们很容易把它们混为一谈。new会去调用operator new操作符完成功能, delete会去调用operator delete操作符完成功能,所以我们能重载只是operator,而不是new和delete本身,虽然就效果来讲一样的,不过概念上显然还是有区别的。

new和new[], delete和 delete[]的优先级问题:

如果你只重载了operator new 和 operator delete,那么对new[]和delete[]的调用都会被归入你重载的函数中。

如果你同时重载了 operator new 和new[], operator delete和delete[],那么在使用new[]和 delete[]时会无视你重载的new[]和delete[],直接选用你重载的new和delete

如果你只重载了new[]和delete[],那么对new和delete的使用不受影响,会走系统默认的实现,而对new[]和delete[],则会进入你重载的new[]和delete[]中。

看的出来,new[]和delete[]被new/delete包含,但是允许你在只想重载new[]和delete[]的情况下,进行有选择的重载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值