首页 > 解决方案 > 函数 free() 不会从向量中释放内存

问题描述

为什么即使我使用 free(a) 从中取消分配内存之后,我仍然可以使用相同的向量?我的意思是说,从内存中释放它之后,我仍然可以使用相同的向量进行操作。

它是 malloc() 的功能还是我的代码中的错误?

int main() {
    int n,i,j;
    int *a;

    printf("n = ");
    scanf("%d", &n);
    if((a=(int*)malloc((1+n)*n/2* sizeof(int)))==NULL){
        printf("Insuficient memory\n");
        exit(EXIT_FAILURE);
    }
    for(i=0;i<n;i++){
        for(j=0;j<n-i;j++){
            if(i==0 || j==0){
                *(a+(2*n-i+1)*i/2+j)=1;
            } else {
                *(a+(2*n-i+1)*i/2+j)=*(a+(2*n-i+2)*(i-1)/2+j)+*(a+(2*n-i+1)*i/2+j-1);
            }

        }
    }
    for(i=0;i<n;i++){
        printf("\n");
        for(j=0;j<n-i;j++){
            printf("%d ",*(a+(2*n-i+1)*i/2+j));
        }
    }
    free(a);
    printf("\nfree() has been used\n");
    for(i=0;i<n;i++){
        printf("\n");
        for(j=0;j<n-i;j++){
            printf("%d ",*(a+(2*n-i+1)*i/2+j));
        }
    }
    return 0;
}

提前感谢<3

标签: cmemory-managementmallocdynamic-memory-allocationfree

解决方案


这是一种释放后使用,是未定义的行为。没有人能保证什么会奏效或不会奏效。

这不是一个错误,您仍然可以访问它。free 所做的只是告诉系统释放内存。平均而言,它可能会在一段时间内继续可用。通常认为你应该在释放后设置一个指向 NULL 的指针,这样你就不会在它被释放后意外使用它。


推荐阅读