2012-10-16 43 views
2

我的应用程序在stlinux(sh4)中使用,不幸的是valgrind不支持sh4 cpu。 因为我看到了内存泄漏与我的应用程序,我用mtrace,并确认一些内存不是免费的。问题是,在返回中使用malloc的变量,因此我没有任何想法,我怎么可以释放它(因为如果它是免费的,那么在函数中返回是没有意义的)?malloc,函数如何自由返回值

我写cs_malloc(把从上面的链接oscam,simple.c娄代码),命令mtrace日志说,在行:

*tmp = malloc (size); 

内存是不是免费的

/* This function encapsulates malloc. It automatically adds an error message to the log if it failed and calls cs_exit(quiterror) if quiterror > -1. 
     result will be automatically filled with the new memory position or NULL on failure. */ 
    void *cs_malloc(void *result, size_t size, int32_t quiterror){ 
     void **tmp = result; 
     *tmp = malloc (size); 
     if(*tmp == NULL){ 
      cs_log("Couldn't allocate memory (errno=%d %s)!", errno, strerror(errno)); 
      if(quiterror > -1) cs_exit(quiterror); 
     } else { 
      memset(*tmp, 0, size); 
     } 
     return *tmp; 
    } 

而且那么对于malloc的,我把它,像这样:

// create the AES key entry for the linked list 
    if(!cs_malloc(&new_entry, sizeof(AES_ENTRY), -1)) return; 

请看看这3个函数(malloc的是不是免费的,一ND作为其他用户说,Valgrind的权利要求,这些代码导致内存泄漏module-datastruct-llist.c

存储器泄漏由3个不同的部件会导致:

  1. 在下面的代码

    “新”永远不会自由,但由于它使用在该函数的返回,我没有想法,我怎么会释放它:

    LL_NODE* ll_append_nolock(LLIST *l, void *obj) 
    { 
    if (l && obj) { 
        LL_NODE *new; 
        if(!cs_malloc(&new,sizeof(LL_NODE), -1)) return NULL; 
        new->obj = obj; 
    
        if (l->last) 
         l->last->nxt = new; 
        else 
         l->initial = new; 
        l->last = new;  
    
        l->count++; 
        return new; 
        } 
        } 
    
  2. 也是“L”在下面的功能使用,又因为它的回报功能使用,我不知道如何释放它。 :

    LLIST *ll_create() 
        { 
        LLIST *l = cs_malloc(&l, sizeof(LLIST), 0); 
        pthread_mutex_init(&l->lock, NULL); 
        return l; 
        } 
    
  3. 同样的故事与新:

      LL_NODE *ll_prepend(LLIST *l, void *obj) 
         {    
         if (l && obj) { 
    
         LL_NODE *new; 
         if(!cs_malloc(&new,sizeof(LL_NODE), -1)) return NULL; 
    
         new->obj = obj; 
         ll_lock(l); 
         new->nxt = l->initial; 
    
         l->initial = new; 
         if (!l->last) 
          l->last = l->initial; 
         l->count++; 
         ll_unlock(l); 
    
         return new; 
        } 
         return NULL; 
        } 
    

更多的功能,你可以看到module-datastruct-llist.c

会非常感激,如果任何专家告诉我,我怎么能解决这个问题内存泄漏(如果您觉得,应该重写cs_malloc,或者需要添加新的函数,请写下您的意思源代码。)

+1

对于全部源代码需要更深入地了解更深,请检查该浏览器的TRAC]: http://www.streamboard.tv/oscam/browser/trunk/?rev= 5375 –

+1

您是否考虑在标准x86或x86_64 Linux发行版上编译和测试您的应用程序,并在其上使用'valgrind'? –

+0

除了我的C编译器抱怨从void *到void **的无效隐式赋值(但是我知道它在做什么,因此一个强制转换清除了这个),cs_malloc()函数显得声音(或者我还没有今天早上有足够的咖啡),所以我认为你的问题不在那里。开始检查使用情况。 – WhozCraig

回答

0

malloc最常用的实现是使用堆内存,这是全局的,所以在最终释放之前,将存储分配到一个地方是很常见的。

现在,有例如调用ll_append_nolock忽略malloced返回。即

ll_append_nolock(it->l, obj); 

这样可以避免你需要做的你做什么,在其他地方,即让调用函数获得分配的内存为指针泄漏:

LL_NODE *n = ll_append_nolock(l, obj); 
/* do stuff with "n", which points to memory allocated under the name of "new" */ 
free(n); 

,当你通过与n(如上所述,它指向以“new”名称分配的存储空间,即:相同的内存,不同的名称),您可以释放它。

HTH。

+0

如果名称(ll_append_nolock)符合其名称,则通过该指针返回的已分配节点也会附加到链接列表(l)。如果没有,我同意,并释放它是强制性的,否则不会导致链表中的无效节点? – WhozCraig

0

在您的功能cs_malloc中,第一个参数是result,但是您永远不会在功能cs_malloc中分配给它。

后来使用cs_malloc这样

if(!cs_malloc(&new,sizeof(LL_NODE), -1)) return NULL; 
    new->obj = obj; 

自从“新”,这是行不通的未初始化

您应该分配给导致您cs_malloc或只返回块cs_malloc,如果您未能分配,只需返回NULL

例如

void *cs_malloc(size_t size, int32_t quiterror) 
{ 
    void* tmp = calloc(1,size); 
    if(tmp == NULL) 
    { 
    cs_log("Couldn't allocate memory (errno=%d %s)!", errno, strerror(errno)); 
    if(quiterror > -1) cs_exit(quiterror); 
    } 
    return tmp; 
} 

if (new = cs_malloc(sizeof(LL_NODE),-1)) 
    { 
    new->obj = obj; 
    } 
    else 
    { 
    return NULL; 
    } 
0

@Anders 感谢您的回复,我会为u描述看到内存泄漏它是如何去采取考虑你的注意,一要改变它......

怎么样,这行应该改成你写的新的cs_malloc函数: 1.

LLIST *l = cs_malloc(&l, sizeof(LLIST), 0); 
    pthread_mutex_init(&l->lock, NULL); 
    return l; 

2.

if(!cs_malloc(&para,sizeof(struct read_thread_param), -1)) return FALSE; 
      para->id=i;