【问题标题】:Regarding finding memory leak in a running process关于在正在运行的进程中发现内存泄漏
【发布时间】:2012-02-29 19:16:42
【问题描述】:

如果进程执行一次并连续运行,而在该进程中仅动态分配内存一次,并且没有使用 free() 函数调用释放,我们能否说该进程正在泄漏内存。 基本上,该变量的内存是在进程源代码的入口过程中分配的,并且在进程初始化时调用一次

这里是进程的示例代码sn-p

void caoamKeycodeInit(int *cesFd,int *sosFd,int *dcnFd,unsigned short gId,unsigned short suId,unsigned short sosSuId)
{
keycodeApiManager *caoamKeyApiInstance;
caoamKeyApiInstance = (keycodeApiManager*)malloc(sizeof(keycodeApiManager));

/*********rest of the proc code *****/

}

这里的内存被分配给 caoamKeyApiInstance 指针变量,它是 caoamKeyApiInstance 类型的,它是一个 struct 变量。 将感谢您的意见。

【问题讨论】:

    标签: pointers memory-leaks


    【解决方案1】:

    你应该区分 loststill reachable 动态分配(很像 Valgrind 所做的):如果不再存在指向动态内存的指针,那么该内存是 丢失了,这应该被认为是一个编程错误,无论它是在一个循环中并在增长,或者只是一个关闭。

    另一方面,如果您分配了几个全局资源并且不清理它们,那么它们只是仍然可以访问:如果您可以释放它你想要,但你只是不打扰。这是一个不同的问题,虽然它可能不是非常优雅(和晦涩的调试),但它也不是世界末日。

    这是一个例子:

    void * p, * q = malloc(100);
    
    for (int i = 0; i != 10; ++i)
    {
        p = malloc(15);
    }
    

    在这种情况下,q 的内存仍然可以访问,您可以在最后使用free(q); 释放它。另一方面,循环中十分之九的分配丢失,您永远无法恢复它们。

    您可以按照以下方式设计类似循环的东西以确保安全:约定指针始终为 NULL 或有效。

    void * p = 0;
    
    void free_it(void ** q) { free(*q); *q = NULL; }
    
    void make_something(void *q)
    {
        free_it(q);
        if (some_condition()) { q = malloc(100); }
    }
    
    int main()
    {
        p = malloc(25);
        // ...
        make_something(p);
        // ...
        free_it(p);
        // ...
    }
    

    基本上,无论您当前是否持有动态内存,p 将始终准确地反映该状态,并且无论何时您想要分配新的东西,您都可以安全地释放以前的指针值,因为它要么是有效的并且需要被释放或为空。

    【讨论】:

    • 仍然不清楚...实际上内存继续分配给在进程初始化期间完成但尚未释放的变量..这是否涉及我想澄清的内存泄漏...
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    相关资源
    最近更新 更多