1.如何检查C中的内存泄漏
如何检查C 中的内存泄漏 内存泄漏是编程中常常见到的一个问题,我所遇过的原因有两个:1。
分配完内存后忘记回收2。代码有问题,造成想回收却无法回收,例如:int* p=new int;p=new int; //p指针修改,原来申请内存的地址没有记录下来,于是无法释放 下面介绍如何检查内存泄漏:1。
包含头文件和定义#define _CRTDBG_MAP_ALLOC //并非绝对需要该语句,但如果有该语句,打印出来的是文件名和行数等更加直观的信息#include #include (1)#include语句必须采用上文所示顺序。 如果更改了顺序,所使用的函数可能无法正确工作(2)如果有cpp文件无法看到这三行,以下函数就无效了,于是应该把这三行放到一个头文件里,确保每个cpp文件会调用到它2。
方法一:使用_CrtDumpMemoryLeaks()int main(int argc , char* argv[]){ {new int;} _CrtDumpMemoryLeaks(); return 0;}output:Detected memory leaks!Dumping objects ->{49} normal block at 0x00384DA8, 4 bytes long。 Data: CD CD CD CD Object dump complete。
其内容包括:内存分配型号(在大括号内)、块类型(普通、客户端或 CRT)、十六进制形式的内存位置、以字节为单位的块大小、以字节为单位的块大小、前 16 字节的内容(十六进制)注意:(1)大括号的位置,如果不加{new int;},这块内存是等到main函数结束才泄漏的,而_CrtDumpMemoryLeaks()是在main函数里调用的,于是判断内存泄漏class A{public: int* Data; A() { Data=new int; } ~A() { delete Data; }};int main(int argc , char* argv[]){ A Test; _CrtDumpMemoryLeaks(); return 0;}output:Detected memory leaks!Dumping objects ->{49} normal block at 0x00384DA8, 4 bytes long。 Data: CD CD CD CD Object dump complete。
(2)对于一些全局函数,如果初始化时申请了内存,到程序结束时候才释放,此函数会一直把新申请的内存当作泄漏来对待A Test;int main(int argc , char* argv[]){ _CrtDumpMemoryLeaks(); return 0;}output:Dumping objects ->{49} normal block at 0x00384DA8, 4 bytes long。 Data: CD CD CD CD Object dump complete。
2。方法二:在程序入口写几个语句,程序退出时,如果发现有内存泄漏,会自动在DEBUG OUTPUT窗口和DebugView中输出内存泄漏信息int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); tmpFlag |= _CRTDBG_LEAK_CHECK_DF; _CrtSetDbgFlag( tmpFlag );3。
方法三:使用_CrtMemCheckpoint(),可以查出某程序段的内存泄漏情况int main(int argc , char* argv[]){ CrtMemState s1, s2, s3; _CrtMemCheckpoint( &s1 ); new int; //程序段 _CrtMemCheckpoint( &s2 ); if ( _CrtMemDifference( &s3, &s1, &s2) ) _CrtMemDumpStatistics( &s3 ); return 0;}output: bytes in 0 Free Blocks。 4 bytes in 1 Normal Blocks。
0 bytes in 0 CRT Blocks。0 bytes in 0 Ignore Blocks。
0 bytes in 0 Client Blocks。 Largest number used: 0 bytes。
Total allocations: 4 bytes。
2.内存卡检测工具怎么用?
SDFormater内存卡检测工具 Panasonic?SDFormatter是一个由松下出品的可以将内存卡格式化的工具,可以支持很多品牌的SD卡、存储卡。
将其通过USB读卡器使内存卡格式化之后,可以检测内存卡的容量以及修复大部分遗失数据,并且恢复之前不能使用或者不能正确的识别的内存卡。 这个检测工具是严格遵照SD内存卡的存储规格来格式化的,并提供对SD内存卡更容易和更快的操作方式。
使用此检测工具就需要将内存卡的格式与其对应,才能正确的检测出内存卡的问题。 MyDiskTest检测工具 MyDiskTest是SD内存卡、U盘和手机TF卡等的专用检测工具,这个检测工具主要针对内存卡的存储容量还有对内存卡的扩容检测、读写速度测试和文件对比测试。
在官方网站和正确途径下载下来之后,要将其与内存卡关联起来,然后点击确定,就可以进行检测。 chipgenius芯片精灵(USB检测工具) 这项检测工具主要是针对USB的,这是一个外用的检测工具,小巧方便,插入接口便能使用,是一个绿色软件。
主要功能是可以自动的去查询读卡器、MP3/MP4、U盘、移动硬盘等。 chipgenius芯片精灵不同于其他检测工具的是它的方便和小巧,可以随时查询usb设备的信息、接口速度、序列号等等,是电子消费者、发烧友、数码消费者的最爱。
当然,这里有一个小提示,就是如果内存卡出现故障时,先不要着急,可以先尝试使用橡皮擦或者细腻的纸巾去擦拭内存卡金手指部位,就像电池没电了用牙齿咬一下又可以用一样。 在急迫的时候,这个小方法可能会派上用场。
3.系统测试中怎么确定内存泄露
是不是说没有一种内存检查工具能够在linux使用呢,也不是,像valgrind工具还是相当不错的。
他的下载地址是下载一个valgrind3.2.3(tar.bz2)工具,按照里面的README提示,安装后就可以使用这个工具来检测内存泄露和内存越界等。这是一个没有界面的内存检测工具,安装后,输入valgrindls-l验证一下该工具是否工作正常(这是README里面的方法,实际上是验证一下对ls-l命令的内存检测),如果你看到一堆的信息说明你的工具可以使用了。
在编译你的程序时,请设置-g参数,编译出后使用如下的命令来判断你的程序存在内存泄露:valgrind--tools=memcheck--leak-check=fullyourProg在输出信息中就会看到你的内存问题了。
4.C语言中的内存泄露 怎样避免与检测
常见的内存错误及其对策如下:1、内存分配未成功,却使用了它 编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。
常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数 的入口处用assert(p!=NULL)进行检查。
如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。2、内存分配虽然成功,但是尚未初始化就引用它 犯这种错误主要有两个起因:一是没有初始化的观念;二是误以为内存的缺省初值全为零,导致引用初值错误(例如数组)。
内存的缺省初值究竟是什么并没有统一的标准,尽管有些时候为零值,我们宁可信其无不可信其有。所以无论用何种方式创建数组,都别忘了赋初值,即便是赋零 值也不可省略,不要嫌麻烦。
3、内存分配成功并且已经初始化,但操作越过了内存的边界 例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for循环语句中,循环次数很容易搞错,导致数组操作越界。
4、忘记了释放内存,造成内存泄露 含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。
终有一次程序突然死掉,系统出现提示:内存耗尽。未初始化的内存 在本例中,p 已被分配了 10 个字节。
这 10 个字节可能包含垃圾数据。char *p = malloc ( 10 ); 如果在对这个 p 赋值前,某个代码段尝试访问它,则可能会获得垃圾值,您的程序可能具有不可预测的行为。
p 可能具有您的程序从未曾预料到的值。良好的实践是始终结合使用 memset 和 malloc,或者使用 calloc。
char *p = malloc (10); memset(p,'\0',10); 现在,即使同一个代码段尝试在对 p 赋值前访问它,该代码段也能正确处理 Null 值(在理想情况下应具有的值),然后将具有正确的行为。内存覆盖 由于 p 已被分配了 10 个字节,如果某个代码片段尝试向 p 写入一个 11 字节的值,则该操作将在不告诉您的情况下自动从其他某个位置“吃掉”一个字节。
让我们假设指针 q 表示该内存。结果,指针 q 将具有从未预料到的内容。
即使您的模块编码得足够好,也可能由于某个共存模块执行某些内存操作而具有不正确的行为。下面的示例代码片段也可以说明这种场景。
char *name = (char *) malloc(11); // Assign some value to name memcpy ( p,name,11); // Problem begins here 在本例中,memcpy 操作尝试将 11 个字节写到 p,而后者仅被分配了 10 个字节。作为良好的实践,每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对。
一般情况下,memcpy 函数将是用于此目的的检查点。内存读取越界 内存读取越界 (overread) 是指所读取的字节数多于它们应有的字节数。
这个问题并不太严重,在此就不再详述了。下面的代码提供了一个示例。
char *ptr = (char *)malloc(10); char name[20] ; memcpy ( name,ptr,20); // Problem begins here 在本例中,memcpy 操作尝试从 ptr 读取 20 个字节,但是后者仅被分配了 10 个字节。这还会导致不希望的输出。
内存泄漏 内存泄漏可能真正令人讨厌。下面的列表描述了一些导致内存泄漏的场景。
重新赋值 我将使用一个示例来说明重新赋值问题。char *memoryArea = malloc(10); char *newArea = malloc(10); memoryArea 和 newArea 分别被分配了 10 个字节,它们各自的内容如图 4 所示。
如果某人执行如下所示的语句(指针重新赋值)…… memoryArea = newArea; 则它肯定会在该模块开发的后续阶段给您带来麻烦。在上面的代码语句中,开发人员将 memoryArea 指针赋值给 newArea 指针。
结果,memoryArea 以前所指向的内存位置变成了孤立的。它无法释放,因为没有指向该位置的引用。
这会导致 10 个字节的内存泄漏。要避免内存相关的问题,良好的实践是:始终结合使用 memset 和 malloc,或始终使用 calloc。
每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对。在对指针赋值前,要确保没有内存位置会变为孤立的。
每当释放结构化的元素(而该元素又包含指向动态分配的内存位置的指针)时,都应首先遍历子内存位置并从那里开始释放,然后再遍历回父节点。始终正确处理返回动态分配的内存引用的函数返回值。
每个 malloc 都要有一个对应的 free。确保您不是在访问空指针。
5.win10怎么查电脑内存型号
方法一:使用第三方软件查看下载测试软件检测查看(CPU-Z、Windows优化大师、鲁大师)。
方法二:1G表示:该内存条的大小。DDR2表示:内存条是几代的。
图中的是2代的内存条。667表示:表示内存条的频率。
方法三:1、在桌面中可以有显示回收站图标,可以通过该途径,找到“我的电脑”(win10系统升级默认叫做“此电脑”)。2、双击“回收站”,在左侧列表中可以看见“快速访问”、“此电脑”、“网络”以及家庭组等。
3、右键鼠标点击“此电脑”,弹出下拉菜单中,左键点击属性。4、就会弹出“查看有关计算机的基本信息”面板了,在下面可以找到系统列表中的“安装内存(RAM)”的属性值了。
当然也有其他的一些属性。方法四1、第二种查看电脑内存的快速方法,鼠标右键任务栏,点击,弹出菜单栏。
2、点击菜单栏中的“任务管理器(K)”,弹出“任务管理器”信息面板。3、点击面板上面的“性能”,在下面性能栏里面可以查看到内存属性,内存大小以及所使用的情况。
4、打开任务管理器的另一种快捷方法是,鼠标右键左下角的WIN10徽标,弹出菜单,点击菜单中的“任务管理器(T)”就可以。
转载请注明出处windows之家 » win10怎么检测内存泄漏