转载:内存泄露

本文探讨了在处理大数据集时遇到的内存泄漏问题,并介绍了如何使用VC++内置工具检测内存泄漏及常见泄漏情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近,一直在做关于不确定数据聚类的实验。代码是花了一个月的时间写完的,写完后在较小的数据集中运行,算法运行的结果挺不错的。这几天,导师让我再添加几个较大的数据集,可是在大数据集上,机器每次都卡死。我猜测是产生内存泄漏导致的,于是花了段时间来研究内存泄漏和常见的解决方法。

        平时的编程练习不会涉及到特大的数据,所以,不会注意到内存泄漏导致的危害。一般来说,当程序需要较长时间的运行时,内存泄漏的危害会慢慢的体现出来。泄漏的内存会越堆积越多,最终,编译器无法为程序分配新内存,导致内存管理程序一直占用CPU,所以电脑或者服务器会变得很卡。

如何发现内存泄漏

        一般来说,程序运行过程中,如果电脑变的很卡。这时,就应该考虑是内存泄漏导致的。当然,如果电脑本身内存较小,CPU主频很低,即使不发生内存泄漏,当内存使用量达到一定程度时,也会变得很卡。

        VC6.0本身就带有内存检测的工具,即调试器和CRT调试堆函数。因为内存泄漏主要是由于没有释放由malloc和new分配的堆内存导致的,这两个工具对堆内存进行检测。汇报相关的泄漏情况。

        为了使用调试堆函数,必须在C或者C++代码中添加下面的宏定义和头文件:

        #define _CRTDBG_MAP_ALLOC

        #include<stdlib.h>

        #include<crtdbg.h>

        引入这个宏定义和头文件后,在想检查内存泄漏情况的地方使用语句:

        _CrtDumpMemoryLeaks();

        在VC++调试会话(按F5运行调试),输出窗口的Debug页会看到与其的内存泄漏情况。不过使用CRT调试堆函数不能够得到内存泄漏的具体的行,会通知内存泄漏的大小。

常见的内存泄漏情况

        常见的内存泄漏主要是由于使用malloc函数和new之后,没有使用相应的free函数和delete导致的。其实这种情况很容易解决,只要我们保证每个malloc和new之后就有一个free和delete来释放相应的内存就可以。

        有一个地方需要注意,那就是二维数组的释放。一般来说,二维数组的声明如下:

        int **a = new int[5][4];或者int (*a) = malloc(sizeof(int) * 5 * 4);

        前一个数组释放时需要这样:

        for(int i = 0; i < 5; i++)

        {

                delete []a[i];

        }

        后一个直接free(a)就可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值