2014-09-28 95 views
-1

考虑的变量与malloc定义(char *)sTmp“malloc”ed内存是否隐式释放?

如果我分配另一个变量此sTmp,确实通过这个变量分配的存储器获得自动释放或这是否存储块保持直到该过程结束分配(&无用) ?

让我用一个代码解释:

int main() { 
    char *sTmp = (char *) malloc (50); 
    char *sNew = strdup ("some text"); // length is less than 50 
    sTmp = sNew; 
    /* now sTmp points to sNew and it's length is 10 chars 
     I wonder, what happened to the allocated memory of 50 chars in the first line; 
     Does it get freed implicitly or remain allocated? 
    */ 
} 
+0

您已经创建了内存泄漏。内存仍然分配。 – perh 2014-09-28 11:55:48

回答

2

由于某些内存区域为malloc -ed,但不是free -d,因此您有memory leak。但是,在大多数操作系统上(特别是在Linux和其他POSIX系统上),操作系统在终止一个process后释放所有资源(包括内存)。所以你可能会决定不打扰太多(至少对于数据是malloc-只在创业时间一次)。

你可以使用一些内存泄漏检测仪像valgrind,你应该与所有警告和调试信息(如gcc -Wall -g)编译和使用调试器(如gdb

顺便说一句,你可以考虑使用一个garbage collector,像Boehm's conservative garbage collector 。然后,您将使用GC_MALLOC而不是malloc,GC_STRDUP而不是strdup,并且您不会打扰致电free(如果您这么做了,则会改为拨打GC_FREE)。 GC通常会释放无法访问的内存。

+0

好的......我对C很陌生,而不是搞乱“垃圾收集器”,我宁愿保持清醒状态,并明确地继续释放内存。谢谢。 – ssd 2014-09-28 12:14:34

+1

我相信你至少应该知道*垃圾收集技术和术语(至少,阅读链接的wikipage)。另外,请了解如何使用调试器和内存泄漏检测器。 – 2014-09-28 12:27:15

4

是否“malloc的” ED内存得到释放含蓄?

没有,是C.

没有垃圾收集机制,你必须明确地freemalloc

sTmp = sNew; 

分配内存时,该赋值语句会导致内存泄漏,释放对象在分配之前。

1

内存被分配并且指针丢失,现在您不能释放此内存直到程序结束