是否" malloc" ed内存被隐式释放?

时间:2014-09-28 11:53:57

标签: c malloc free

考虑使用sTmp定义的(char *)变量malloc

如果我将另一个变量分配给此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?
    */
}

3 个答案:

答案 0 :(得分:4)

  

“malloc”ed内存是否会被隐式释放?

不,C中没有垃圾收集器机制。

您必须使用free

明确malloc分配的内存
sTmp = sNew;

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

答案 1 :(得分:2)

由于某个记忆区已经malloc - 但不是free - d,因此您有一个memory leak

但是,在大多数操作系统上(特别是在Linux和其他POSIX系统上),操作系统在process终止后释放所有资源(包括内存)。所以你可能决定不打扰太多(至少对于malloc的数据 - 仅在一次非正式时间内编辑一次。)

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

顺便说一句,您可以考虑使用garbage collector,例如Boehm's conservative garbage collector。然后,您将使用GC_MALLOC代替mallocGC_STRDUP代替strdup,而您也无需致电free(如果您这样做,那么,您我会打电话给GC_FREE。 GC通常会释放无法访问的内存。

答案 2 :(得分:1)

内存被分配并且指向它的指针丢失了,现在你不能释放这个内存直到程序结束