运算符new和delete的重载

    在学习c++的时候,我们知道new和delete可以重载,但是它们有什么用呢?
    在我写语义分析的时候遇到一个问题,有一些很碎的内存被new出来,不知道在哪delete(因为它要往上一级一级的传),不知道该怎么delete(应为转化为void*类型了)。还有就是当你中间发现语义错误,退出语义分析的时候,有一大堆内存还没有被delete呢。这些内存的delete都让人头痛。
    但是有了重载这个东西,我就可以集中分配,语义分析结束集中delete,在中间可以delete,也可以不delete,这个都不会使内存泄露。这样就大大减少内存操作的压力,代码变的简单,系统变得稳定。
    代码我会贴在后面。在实现这个过程,我经历了一些波折。
    波折一:把该类写成模板形式,并且认识到如果类A重载MyAllocator,只有new A,才会进我设置的new的函数,说明运算符是和类型绑定的。
    波折二:发先一个指针在delete后还能delete,delete[]之后还能delete,这些都是有问题的代码。我就想了个办法,在内存前面加上标志DW_MARK_USED和DW_MARK_FREE,表示被使用和空闲状态。
    在实现后我发现重载new和delete有两个特殊的地方。
    特殊一:new和delete的重载函数默认是static的,不管你是不是显示的写上static。
    特殊二:new[]的返回指针会自动向后加4个字节,delete[]传入的参数会自动减上4个字节。如你return的是0x00670000,得到的却是0x00670004,当你delete[]的时候,传的是0x00670004,在delete[]函数内部变成0x00670000。我问过大牛,他说这4个字节存的是有多少个对象被new出来。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值