操蛋的Bug

阅读: 评论:0

操蛋的Bug

操蛋的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的内存, 却new了type2的对象.

本文发布于:2024-02-01 14:14:43,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170676808437177.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:Bug
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23