使用devpartner的blockchecker检查c++内存错误

  在仿写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相加结果自然也不一样。一个括号浪费了我这么多时间。。。所以有个好的工具是多么重要。但是再好的工具也不能明确地指出是哪里出错,就像上面的例子,最后一步还是要我们自己推出来。

 1 //返回一个大小为n的对象,并可能加入大小为n的其他区块到freelist
 2 //在ANSI c中,void *不允许进行加减操作,所以chunk用char *
 3 void *default_alloc::refill(size_t n)
 4 {
 5     int objs = 20;
 6     char *chunk = chunk_alloc(n, objs);
 7
 8     obj *next = nullptr, *current = nullptr;
 9     obj *result = nullptr;
10     obj **my_free_list = nullptr;
11     if (1 == objs)    //只取出一个区块
12         return chunk;
13     my_free_list = free_list + FREELIST_INDEX(n);
14     result = (obj *)chunk;    //这一块返回给客户端
15     //将freellist指向分配的区域
16     *my_free_list = next = (obj *)(chunk + n);
17     for (int i = 1;; i++)
18     {
19         current = next;
20         next = (obj *)((char *)next + n);    //这里注意不能直接用next+n
21         if (i == objs - 1)
22         {
23             current->next = nullptr;
24             break;
25         }
26         else
27             current->next = next;
28     }
29     return result;
30 }

时间: 2024-08-05 11:20:43

使用devpartner的blockchecker检查c++内存错误的相关文章

C语言常见内存错误

C语言指针和内存泄露 常见的内存错误: 1.      内存分配未成功却使用了它. 如果指针p是函数的参数,要在函数的入口处用assert(p!=NULL)进行检查: 如果是用malloc来动态申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理. 2.      内存分配成功,尚未初始化就使用它. 3.      内存分配成功并且初始化,但操作越界. 例如在使用数组时经常发生"多1"或"少1"操作. 4.      忘记释放内存造成内存泄露.

利用 LeakCanary 来检查 Android 内存泄漏

前言 你被概率性的 OOM 困扰么?有时候,OOM 像幽灵一样,挥之不去,可真想把它揪出来时,又捉之不着.或许,是时候用 LeakCanary 来诊断一下了.它是一个用来检查 Android 下内存泄漏的开源库,这篇文章主要介绍其用法.架构和其背后的实现原理. Square 有篇文章介绍了开发这个库的原因.他们的一个付款流程里,需要用到用户的签名,他们直接用 Bitmap 来画签名,Bitmap 大小和屏幕分辨率是一样的.问题来了,在试图创建这个 Bitmap 对象时,概率性 OOM 如幽灵般相

iOS开发 两个内存错误的一般处理方法

本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101dxlj.html 由于iOS5.0之前没有自动应用计数机制,也没有Java那样的垃圾回收功能.我们都需要自己管理和控制对象的回收,这是一件很麻烦的事情,也是做iOS项目中最容易出现的问题.如果不掌握这些方法,调试这些问题几乎没有头绪. 1.EXC_BAD_ACCESS内存错误与NSZombieEnabledEXC_BAD_ACCESS是最常见的错误了,这个一般是访问了释放了的内存地址空间造成的.比

C语言中常见的内存错误与解决方法

常见的错误 关于内存的一些知识已在内存分配中提及,现记录与分享常见的内存错误与对策. 类型 1:内存未分配成功,却使用了它. 方   法:在使用之前检查指针是否为NULL. 1)当指针p是函数的参数时,在函数入口处用语句assert(p!=NULL)进行断言检查. 2)当使用malloc或new来申请内存时,应该用if(p != NULL)进行防错检查. 类型 2:引用了尚未初始化的指针 原   因:内存的缺省初始值究竟是什么并没有统一的标准,在使用之前都进行初始化. 1)没有初始化的观念. 2

大内高手—常见内存错误

转自:http://blog.chinaunix.net/uid-23228758-id-4355524.html 随着诸如代码重构和单元测试等方法引入实践,调试技能渐渐弱化了,甚至有人主张废除调试器.这是有道理的,原因在于调试的代价往往太大了,特别是调试系统集成之后的BUG,一个BUG花了几天甚至数周时间并非罕见. 而这些难以定位的BUG基本上可以归为两类:内存错误和并发问题.而又以内存错误最为普遍,即使是久经沙场的老手,也有时也难免落入陷阱.前事不忘,后世之师,了解这些常见的错误,在编程时就

关于ios 里面碰到内存错误的两种设置

1.EXC_BAD_ACCESS内存错误与NSZombieEnabled EXC_BAD_ACCESS是最常见的错误了,这个一般是访问了释放了的内存地址空间造成的.比如一个对象已经dealloc了,如果你仍向这个对象发 送消息,就会出现这个错误.由于出现这个错误时,几乎不显示什么有用的信息,我们根本无法确定程序错在何处.使用NSZombieEnabled环境变量 可以很好的解决这个问题. 打开你的工程,选择菜单“Product->Edit Scheme”或快捷键“Commend+<” NSZo

常见动态内存错误---内存泄漏

常见动态内存错误 编译器不能自动发现动态内存错误,动态内存错误通常只能在程序运行时才能被捕捉到,而且错误原因不容易查找,错误本身也不容易捕捉,改错难度较大. 1.动态内存分配失败却继续操作 内存不足等有可能导致动态内存分配失败,所以使用new请求分配动态内存后一定要检查返回地址是否为NULL. 如用if(p==NULL) 或 if(p!=NULL)进行检查,未检查前不要操作动态内存空间. 2.动态内存空间未初始化就进行读操作 C++标准并未规定动态内存空间的默认值,程序无法预知该默认值的具体指.

php查询mysql时,报超出内存错误(select count(distinct))时

学时服务器查询教练所带人数时,使用select count(distinct(u_STRNO))时报超出内存错误.后参考“mysqld-nt: Out of memory解决方法”http://jingyan.baidu.com/article/020278116b428d1bcd9ce568.html?qq-pf-to=pcqq.c2c 修改参数: key_buffer            = 512K    #global buffer   => key_buffer           

C/C++ char a[ ] 和 char *a 的差别,改变 char *a爆内存错误的原因

对于一些需要传入参数为 char * temp 指针类的函数: 我们定义一个 char a[10] 或char *a 传进去都是可以的. 但是, 如果该函数是会改变你所传入的参数的值时, 传入 char *a 将爆内存错误,而 char a[10] 却不会. 例如:下面中的 strtok.strcpy.strcat 如果第一个参数传入的是 char *a 指针类型,都是会引起爆内存错的 我例子中没使用 char * 原因: 指针类型 * 它是没被分配地址空间的,定义了就是一个指针常量,常量去改变