在仿写stl的过程中,被一处内存错误卡了很久。当内存池需要多次malloc时会出现堆损坏的错误,初步判断是数组越界,但总是检查不出来。一开始用Dr.Memory检查不出来,就试了一下devpartner。官网链接 http://www.borland.com/zh-CN/Products/Software-Testing/Automated-Testing/Devpartner-Studio

  devpartner安装完后会自动在vs上装插件,但是那个插件好像没什么用。我是直接在安装目录下找到blockchecker,并用它打开要调试的exe,再点击运行,就能看到检测到的错误,如图

它提示这里指针运算范围错误,那为什么会错误呢?可以看到上面的代码

    *my_free_list = next = (obj *)chunk + n;

应为

    *my_free_list = next = (obj *)(chunk + n);

原来是忘了加括号了!!因为obj型指针和char型指针大小是不一样的,所以和n相加结果自然也不一样。一个括号浪费了我这么多时间。。。所以有个好的工具是多么重要。但是再好的工具也不能明确地指出是哪里出错,就像上面的例子,最后一步还是要我们自己推出来。

 //返回一个大小为n的对象,并可能加入大小为n的其他区块到freelist
//在ANSI c中,void *不允许进行加减操作,所以chunk用char *
void *default_alloc::refill(size_t n)
{
int objs = ;
char *chunk = chunk_alloc(n, objs); obj *next = nullptr, *current = nullptr;
obj *result = nullptr;
obj **my_free_list = nullptr;
if ( == objs) //只取出一个区块
return chunk;
my_free_list = free_list + FREELIST_INDEX(n);
result = (obj *)chunk; //这一块返回给客户端
//将freellist指向分配的区域
*my_free_list = next = (obj *)(chunk + n);
for (int i = ;; i++)
{
current = next;
next = (obj *)((char *)next + n); //这里注意不能直接用next+n
if (i == objs - )
{
current->next = nullptr;
break;
}
else
current->next = next;
}
return result;
}

最新文章

  1. spring boot(二):web综合开发
  2. EntityFramework错误:Unable to update the EntitySet because it has a DefiningQuery
  3. win8下始终以管理员身份运行vs2012的解决办法
  4. 数据挖掘系列(2)--关联规则FpGrowth算法
  5. ecshop 工作流程加载配置介绍
  6. loop_nslookup
  7. 函数执行到return就结束了
  8. ldr指令总结
  9. Ansible好像很好玩的样子哟
  10. Robot FrameWork 教程链接
  11. 一个C#多线程的工作队列
  12. httpcomponents-client-4.3.x DOC
  13. 已知整数m,n,p,q适合(m-p)|(mn+pq)证明:(m-p)|(mq+np)(整除理论1.1.5)
  14. BZOJ2870 最长道路
  15. 运维自动化之系统部署 PXE(二)
  16. 最优路径算法合集(附python源码)(原创)
  17. ListView的setOnItemClickListener位置错乱问题
  18. ORA-55617解决方法
  19. Alpha冲刺 - (7/10)
  20. springboot(八)自定义Filter、自定义Property

热门文章

  1. C# 读取txt文本内容写入到excel
  2. SVM技法
  3. 图像载入 imread()[OpenCV 笔记4]
  4. 纯手工打造dropdownlist控件
  5. hibernate面试笔记
  6. Python: 设计模式 之 工厂模式例(1)
  7. JAVA NIO 结合多线程
  8. VS2013相关资料
  9. Android 开发环境搭建9传送帖)
  10. bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 動態樹