`
wander754085
  • 浏览: 52149 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

C/C++中内存释放及内存泄露的检测

    博客分类:
  • C++
阅读更多

        今天突发奇想写了一段很奇怪的代码,Node对象的数组我是这样写的:      

 

Node* p = (Node*)malloc(sizeof(Node)*10);
 free(&p[2]); 

 

        从直观上来想象似乎是没有问题的,但却出现了_CrtIsValidHeapPointer的断言,按理说出现了这个问题应该是因为要释放的堆内存越界,但其实是另有原因,再看另一段代码:

 

       BYTE    *pBuffer;
       pBuffer = (BYTE *)malloc(64);
       pBuffer = pBuffer + 32;
       free(pBuffer);

 

       也会出现同样的错误。原因猜测是malloc的时候系统保存了分配地址的起始地址的列表,而free的时候如果尝试去free一个不在列表中的地址,就出错啦。解决方案就不用说了,不同的应用场景不同的上下文有不同的方法。

       在Windows下用CRT库来进行内存泄露的检测还是挺好用的,在目标函数返回时加上_CrtDumpMemoryLeaks();就会输出内存泄露信息,output窗口中的输出有的可以直接定位到程序中的行,但也有的定位不到,只显示如下这种信息:

       Dumping objects ->
{52} normal block at 0x006D2498, 512 bytes long.
?Data: <??????????????? > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{51} normal block at 0x006D2440, 24 bytes long.
?Data: < 4????????????? > 10 34 14 00 FF FF FF FF 00 00 00 00 00 00 00 00 
Object dump complete.

       这个时候可以这样写来找到出问题的行:

 

int main()
{
	_CrtSetBreakAlloc(52);
	run();
	_CrtDumpMemoryLeaks();
	system("pause");
	return 0;
}
       这样在debug模式下程序会自动停在{52}处,通过call stack就会找到出现泄露的代码段了。

 

       总是来说还是不错的,调一些小程序是没啥问题的,不知道windows下有没有valgrind这样的神器,这里有一些推荐http://www.oschina.net/question/161952_24831  但没试过.............

分享到:
评论

相关推荐

    C/C++程序内存泄漏检测

    因此,对C/C++程序进行内存泄漏检测是开发过程中的一个关键环节。 1. **包含头文件和定义** 在C/C++中,为了进行内存泄漏检测,我们需要引入特定的头文件`&lt;stdlib.h&gt;`和`&lt;crtdbg.h&gt;`。`&lt;crtdbg.h&gt;`是Microsoft ...

    C/C++程序内存泄漏检测算法的研究

    C/C++程序内存泄漏检测算法的研究是针对编程中常见的问题——内存泄漏进行深入探讨的主题。在C/C++中,程序员可以直接通过指针管理内存,这带来了高性能的优势,但同时也引入了潜在的风险,如内存泄漏。由于GCC和...

    C/C++监测内存泄露的函数

    本文将探讨如何在C/C++中监测内存泄露,并分享一个可能的实现方案。 1. **内存泄露的概念与危害** 内存泄漏是程序错误的一种,它发生在程序动态分配内存后未能正确释放。随着时间的推移,大量未释放的内存可能导致...

    介绍几款 C/C++内存泄漏检测工具.帮程序员擦屁股用

    本文将详细介绍几款实用的C/C++内存泄漏检测工具,帮助程序员有效地找出并修复内存泄漏。 1. **AddressSanitizer (ASan)** AddressSanitizer是一个由Google开发的高效内存错误检测工具,包括检测堆、栈、全局变量...

    浅谈C/C++内存泄露及其检测工具

    内存泄漏是C/C++编程中一个严重的问题,它指的是程序在申请内存后,无法释放不再使用的内存空间。本文主要探讨了两种主要的解决方案——Smart Pointer和Garbage Collection,以及内存泄漏的检测工具。 首先,Smart ...

    浅谈C_C++内存泄漏及其检测工具

    C/C++的内存泄漏检测技术不断发展,现在有许多工具可以帮助程序员检测内存泄漏。例如,Valgrind是一个功能强大的Linux下的内存调试工具,它可以检测内存泄漏、越界访问、重复释放等问题。它通过在程序运行时模拟...

    C/C++ 内存泄露检测工具 memwatch2.69

    内存泄露是C/C++编程中常见的问题,尤其是在开发大规模、长时间运行的应用时,它可能导致系统资源耗尽,进而引发程序崩溃或系统性能下降。`memwatch`是一个实用的内存泄露检测工具,专为C/C++程序员设计,帮助找出...

    windows下c++内存泄露检测工具使用方

    ### Windows 下 C++ 内存泄露检测工具使用详解 在 Windows 平台下进行 C++ 开发时,内存管理是一项非常重要的任务。由于 C++ 语言本身的特性,开发者需要手动管理内存分配与释放,这就很容易导致内存泄露的问题。...

    C/C++内存编程

    6. **内存泄漏检测**:工具如Valgrind可以帮助检测内存泄漏和未初始化的内存,它们是调试和优化程序的重要助手。 7. **C语言中的动态内存**:在C语言中,使用`malloc`、`calloc`、`realloc`和`free`进行内存管理。...

    C语言/C++雷霆战机代码(终极版)

    9. **内存管理**:C++允许直接管理内存,通过new和delete操作符分配和释放内存。在游戏开发中,有效的内存管理可以避免内存泄漏,保持游戏性能。 10. **调试技巧**:游戏开发过程中,调试是必不可少的环节。学会...

    针对C/C++程序的内存测试

    C/C++程序中的内存管理和泄漏检测是提高软件质量和稳定性的重要环节。通过静态分析和动态监测的结合,可以有效地发现并解决内存泄漏问题。手动检查虽然基础但不可或缺,而工具的使用则可以显著提高效率和准确性。...

    C/C++程序为例内存分布详解

    在C/C++编程中,程序员直接控制内存分配和释放,这既赋予了灵活性,也带来了潜在的问题,如内存泄漏和悬挂指针。 内存主要分为以下几个区域: 1. **栈区(Stack)**:这是由编译器自动分配和释放的内存区域,通常...

    C和C++内存管理资料(包括内存管理-内存泄漏-内存调试-内存检测方法)

    在C和C++中,程序员需要手动管理内存,这意味着你需要知道何时申请内存(如使用`malloc`或`new`),何时释放内存(如使用`free`或`delete`),以及如何有效地组织内存空间。不正确的内存管理可能导致程序崩溃或性能...

    C++中内存泄露检测工具

    6. Memcheck:Valgrind的子工具之一,专门用于检测C和C++程序中的内存错误,包括内存泄露。 使用这些工具时,通常需要编译程序时开启特定的标志,或者在运行时将程序输入到工具中。工具会生成报告,列出可能的内存...

    腾讯c/c++面试题

    4. **内存泄漏检测**:示例代码`while(1){int *p=new int[10000000];}`模拟了一个典型的内存泄漏场景,不断分配内存而不释放,最终导致程序崩溃或资源耗尽。这考验了程序员对内存管理的理解和对潜在问题的警觉。 ##...

    C/C++高质量编程

    理解和掌握动态内存分配、释放、内存泄漏检测以及智能指针的使用是避免这类问题的关键。书中会深入讲解内存管理的细节,帮助读者避免常见的陷阱。 此外,模板和泛型编程是C++的一大特色,它们可以提高代码的重用性...

    学籍管理系统~ C/C++语言 源码下载

    - **动态内存分配**:C++的new和delete关键字用于在运行时动态分配和释放内存,处理如链表节点的创建和销毁。 - **内存泄漏检测**:确保在不再使用内存块时正确释放,避免内存泄漏问题。 7. **编译与链接**: - ...

    Java与C/C++的区别(转).

    相比之下,C/C++中的内存管理依赖于程序员显式地使用`new`和`delete`操作符来分配和释放内存,这就需要程序员更加细心和准确地控制内存生命周期,否则容易出现内存泄漏或者内存错误。 #### 三、数据类型安全 Java...

    C/C++图像处理编程

    内存管理也是关键,合理分配和释放内存可以避免内存泄漏。 此外,为了调试和验证图像处理效果,可视化工具必不可少。可以使用如Matplotlib(Python)、GDI+(Windows)或Qt(跨平台)等库来创建图形用户界面,实时...

Global site tag (gtag.js) - Google Analytics