2009-11-27 107 views
2

我是C初学者,我正在编写一个非常简单的链接列表。我想知道是否会有下面的代码中的内存泄漏:内存泄漏C

void removeListEntry(struct tableEntry *symp, struct tableEntry *previous) { 
    if (symp->next = 0){ 
    symbolList.tail = previous; 
    previous->next =0; 
    } else { 
    previous->next = symp->next; 
    symp->next = 0; 
    } 
} 

我敢肯定,如果指针SYMP没有存储在另一个变量,没有访问该指出由列表条目的方式指针,所以我会有内存泄漏。 在C中,我们使用malloc()函数为数据结构分配内存空间,并且我记得使用new关键字来动态地在C++中分配内存。使用malloc()分配内存和使用new有什么区别?我的代码中确实存在内存泄漏?

回答

1

我很好奇什么是应该在你的代码中发生的事情:

if (symp->next = 0){ 
    symbolList.tail = previous; 
    previous->next =0; 
} else { 
    previous->next = symp->next; 
    symp->next = 0; 
} 

何时symb->next不是零?如果symb为空,那么您不会执行任何操作,因为头节点也将为空。

混乱的部分是你在第一个附加previoussymb如果(这应该总是这样),但在接下来的一个要附加到symbprevious。第二个理论基础是什么,在什么情况下会发生?因为在C/C++中没有垃圾收集器,所以每个要释放的节点都需要被释放,如果你分配内存需要释放内存,否则你有内存泄漏。 。

symb->next = 0可能只是一个错字,正如指出的那样,因为这将永远是真实的,并且是一个常见的错误。我开始做什么来帮助解决这个问题是: if (0 == symb->next),所以如果你做了0=symb->next那么你会得到一个编译器错误。

UPDATE:

正如指出的评论,此功能会经常去'别人的条款,可预期的行为,其实。

+0

symb->未来= 0值总是假的,而不是真实的。 – 2009-11-27 07:49:52

+0

你是对的,我没有想到下一个设置为零后会发生什么。 – 2009-11-27 14:47:49

1

一旦您完成使用由malloc()分配的内存,您需要致电free()

5
if (symp->next = 0) { 

此,如果 - “条件” 是一个赋值,设置symp->next0。如果指向另一个对象的指针存储在symp->next中,则该对象将丢失,并且对象内存不会被释放。

对于需要使用==,而不是一个对比:

if (symp->next == 0) { 

或者做没有一个明确的对比:

if (!symp->next) { 

else情况下,你从列表中删除symp(假设previous实际上包含symp之前的元素),但是你不释放它的内存。这可能是内存泄漏,但它取决于调用该函数的代码:该代码可能仍然释放symp或对已删除的元素执行其他操作,或者可能会忘记它并泄漏内存。

0

正如上面指出的if(symp->next = 0)是一个赋值操作,if语句将计算为false。因此,您不仅会丢失指向symp后面的下一个表项的指针,而且还会丢失上一个 - >下一个指针(我假设它指向symp?)。

的风格早晚的事情,但我个人会重写功能更是这样的:

void removeNextListEntry(struct tableEntry *previous) { 
    struct tableEntry *dummy = previous->next; 
    if (dummy->next == 0){ 
    symbolList.tail = previous; 
    previous->next =0; 
    } else { 
    previous->next = dummy->next; 
    } 
    free(dummy); 
}