操蛋的Bug

自己实现了一个内存分配器, 再用这个分配器实现了一个链表, 每次在分配器析构的时候程序都出现致命错误. 分配器的析构函数中只有一行代码,operator delete [](m_pMemory);这是头一次如何频繁使用 operator new[], operator delete[], 调试了很久不得其解, 网上寻求答案. 搜索引擎都快点烂了, 收获也不小.

  起先搜出来个 nothrownew, 一直没搞明白这是什么, 于是根据这条线索, 当时感觉很深奥, 感慨C++真是博大精深, 我学了这么多年居然都还有未曾见过的功能, 折腾很久发现, 常规的new 会抛出异常,nothrownew 则不会抛出异常, 其他跟常规的new没有区别, 之前的感慨立即转变成了愤怒, 去他娘的C++, 奇技淫巧真他娘的多...

  随后又发现了重载new , 重载delete, 这个在之前看书都是忽略的部分, 这次兴许真是这里出了问题, 根据这条线索, 我又发现了operator new, operator delete有几个重载版, 每个版本都是成对的, 我顿时就明白了, 我使用的时候没有成对使用, 立马屁颠屁颠去改了代码, 长时间过去, 错误依旧没有离开过我的程序. 于是继续查找, 最后在一篇博客中, 终于让我明白了重载这两运算符的作用, 原来还以为重载之后只能显示调用, 这下明白了是在new delete的时候会被隐式调用, 随后又发现new[] 会传入一个表示内存大小的size_t对象, 这个size_t比自己传进去的size_t大了4字节, 为什么要多4字节? 内部使用operator new[]申请内存, 而这里返回的地址又跟new[] 返回的地址相差4字节, 琢磨了一下, 好像明白了,多出来那4字节是存放内存大小的, 要不然delete[]怎么能知道释放的内存有多大, 哈哈, 这下搞明白了, 信心满满去解决问题, 不出我所料, 问题还是没有解决.

  就在一筹莫展的关键时刻, 有一处写错的代码终究没能避开我雪亮的眼睛, 最后问题是解决了, 整个问题就是 申请了type1的内存, 却newtype2的对象.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值