使用free()无法释放内存

时间:2015-07-15 17:11:40

标签: c string malloc free

函数getFree()我在一个类似问题的答案中看到了它,但字符串cpy仍然具有第一次给出的相同字符串它运行的次数,即, T次。所以,有人请帮忙。

void getFree(char ** ptr) {
    if (*ptr != NULL) {
        free(*ptr);
    }
    return;
}

int main() {
    int T, j;
    scanf("%d", &T);
    for (j = 0; j < T; j++) {
        char * cpy,
        int count = 0, i = 0, x = 0, k = 0;
        cpy = (char*)malloc(500 * sizeof(char));
        if (getchar() == '\n') {
            do {
                *(cpy + i) = getchar();
                i++;
            } while(*(cpy + i - 1) != '\n');
        }
        getFree(&cpy); 
        printf("%s", cpy);           
    }
    return 0;
}

4 个答案:

答案 0 :(得分:5)

Free使指针无效,但不会更改该值。如果那是你想要的,你应该把它归零。在释放它之后,它指向的内容是未定义的,但在它被重用之前可能包含最后一个内容。

free(*ptr);
*ptr = NULL;

答案 1 :(得分:0)

您可以考虑将#define GET_FREE_AT_BIS(Lin,PtrVar) do { \ void**ptr_##Lin = (void**) &(PtrVar); \ if (*ptr_##Lin) free (*ptr_##Lin); \ *ptr_##Lin = NULL; \ } while(0) #define GET_FREE_AT(Lin,PtrVar) GET_FREE_AT_BIS(Lin,PtrVar) #define GET_FREE(PtrVar) GET_FREE_AT(__LINE__,(PtrVar)) 作为一个宏(作为Robert Jacobs' answer精神的替代方案),例如

__LINE__

需要双重间接才能使ptr_123扩展并适合宏连接。它用于以某种方式使用ptr等唯一的变量名进行第123行的宏调用(以便于调试,并且经常避免与名为GET_FREE(cpy); 的变量发生冲突)

然后代码

GET_FREE(ptrarr[i++]);

没有任何可见的运算符地址(在宏扩展中完成)。

我的宏即使作为#define GET_FREE_BUGGY(PtrVar) do { free(PtrVar); PtrVar=NULL; } while(0) 调用也应该工作,但是像

这样的更简单但错误的变体
GET_FREE_BUGGY(ptrarr[i++]);
当p i被调用时,

不会像人们期望的那样工作,因为<?php $con=mysqli_connect("localhost","root","","truck"); // Check connection if (mysqli_connect_errno()){ echo "Failed to connect to MySQL: " . mysqli_connect_error(); } $sqlA="select date, truckno, bagscount from vendor"; $sqlB="select date, truckno, bagscount from truck"; $resultA=mysqli_query($con,$sqlA); $resultB=mysqli_query($con,$sqlB); $objA= mysqli_fetch_all($resultA,MYSQLI_NUM); $objB= mysqli_fetch_all($resultB,MYSQLI_NUM); $i=0; $j=0; while ($i<=(mysqli_num_rows($resultA)-1)){ if ($objA[$i][0]=$objB[$j][0] && $objA[$i][1]=$objB[$j][1] && $objA[$i][2]=$objB[$j][2]){ $i++; echo "row ". $i. " matches". $j. "<hr>"; $j=0; } else { echo "not matched!"; $j++; } } ?> 会增加两倍。

答案 2 :(得分:0)

如果free 没有释放内存,正如您所建议的那样,对malloc的后续调用必须返回不同的地址。请注意,参数未被更改,它只是在free返回后访问它的未定义行为。

这只是因为free实际上释放了内存,因此当您请求相同数量的内存时,对malloc的后续调用可以(并且确实)返回相同的地址。

为什么不呢?这实际上是最佳行为。如果您只关心(重新)已分配内存的内容 - freemalloc都不会告诉您有关内容的信息。由于对内容没有任何保证或要求,他们决定不管它。

如果您希望将记忆清零,请改用callocmemset或其他内容。否则只需放松并停止对未初始化记忆中的内容做出假设。

答案 3 :(得分:0)

对于您的特定情况,字符串无需在每次循环迭代中重新分配。考虑一下这个

#include <stdio.h>
#include <stdlib.h>

int main() {
    char * cpy = malloc(500);    // Allocate in the beginning
    int T, i;
    scanf("%d\n", &T);    // Clear newline buffer
    while (T--) {
        // for (i = 0; (cpy[i] = getchar()) != '\n'; ++i);    // Scan until newline
        fgets(cpy, 499, stdin);    // Scan until newline
        printf("%s", cpy);
    }
    free(cpy);    // Free in the end
    return 0;
}

<强>输入

3
abcde
fghij
klmno

<强>输出

abcde
fghij
klmno

查看演示http://ideone.com/KKEz0j