【问题标题】:how to check memory leakage in c code?如何检查c代码中的内存泄漏?
【发布时间】:2011-08-05 11:01:52
【问题描述】:

查看我正在使用多次 malloc 和 free。

所以在应用程序结束时,我想确保没有内存泄漏。 所有 malloc 都被释放。

有什么方法或功能可以看到吗?

另一个问题: 所有所有操作系统大多仅在该应用程序退出时才回收内存,但如果假设应用程序运行很长时间并且如果这样它不断泄漏内存,那么在某些时候将没有未分配的内存&应用程序将崩溃或系统将重新开机……!!是真的吗..???

【问题讨论】:

  • Valgrind 如果它适用于您的平台
  • 使用 valgrind,它会告诉你大部分问题。

标签: c memory embedded


【解决方案1】:

在进程结束时,操作系统会回收使用的内存(因此它不会“泄漏”)。

所以在应用程序结束时,我想确保没有内存 泄漏

编辑

James 在 cmets 中提出了一个有趣的观点:“任何体面的程序员都不应该依赖操作系统来完成他的工作”。我必须强调我正在考虑以下情况:

/* mallocs */

/* frees <- useless */
exit(0);

【讨论】:

  • 也可以在嵌入式设备中使用?没有重新回合??
  • @Mr.32 任何体面的操作系统都应该回收内存。
  • 那为什么大家都说不应该有内存泄漏呢?
  • 任何体面的程序员都不应该依赖操作系统来完成他的工作。
  • 如果应用程序不结束会怎样
【解决方案2】:

不保证操作系统会回收您的内存。桌面或服务器操作系统通常会;嵌入式操作系统可能不会。

那里有几个调试 malloc 库;谷歌debug malloc 并使用适合您的。 GNU libc 内置了调试 malloc

【讨论】:

  • 你可能是对的......你知道为小型特定目的而制作的嵌入式操作系统可能无法解决这个问题......对吧??
【解决方案3】:

首先,您应该使用调试支持编译您的代码(在 gcc 中,它是 -g)。请注意,这不是必需的,但它使调试器能够为您提供行号作为优势之一。

然后,您应该使用 valgrind 或 gdb 之类的不错的调试器来运行您的代码。 他们应该告诉你内存被分配但没有被释放的行。

Valgrind 是一个非常强大的调试工具。您需要使用 --tool=memcheck 选项(我认为默认情况下已启用,但知道也无妨)。

【讨论】:

    【解决方案4】:

    你可以把malloc()free()包装起来,自己统计一些基本的统计数据

    #define malloc(x) malloc_stat(x)
    #define free(x) free_stat(x)
    
    static counter = 0;
    
    void* malloc_stat( size_t s ) {
        counter++;
        return malloc(s);
    }
    
    void free_stat( p ) {
        counter--;
        free(p);
    }
    

    【讨论】:

    • 还有下一层:捕获并保存返回地址或堆栈跟踪以及分配。
    • ..and __LINE__ malloc 被调用
    • @user786653: 呵呵,可能将结果存储在malloc-ed内存中。
    • 我建议只是过度分配而不是再次调用 malloc :)。顺便说一句,Paul Nettles Memory Manager 可以做到这一点以及更多。
    • 肯定比调用包装好的 malloc 更好:)
    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多