堆栈记忆"泄漏"在C.

时间:2015-10-08 21:25:23

标签: c memory-management memory-leaks

考虑以下代码段:

void f() {
    int arr[10];
    arr = malloc(sizeof(int) * 100);
    for (int i = 0 ; i < 100 ; i++) {
        printf("%d ", arr[i]);
    }
    puts("");
    free(arr);
}

当函数f返回时,是否会释放原始arr[10]堆栈内存? (或者这是堆栈内存泄漏吗?)

3 个答案:

答案 0 :(得分:7)

你做不到

 arr = malloc(sizeof(int) * 100);

就像你在代码段中所做的那样(尝试做)。 arr是数组类型,不允许赋值。

随后,也许值得一提,在非动态分配的指针上调用free()会调用undefined behavior

FWIW,“泄漏”进入了由动态内存分配(通常是堆)分配的内存。对于在“堆栈”区域(通过编译器)分配的变量,不需要从程序中管理(用于解除分配或免费 - )。

答案 1 :(得分:0)

当你声明数组arr时,你已经在它上面分配了空间(在你的函数堆栈上)。使malloc内存(在堆上分配)分配给该数组是没有意义的。你正在调用编译错误。您应该使用指针而不是声明该数组。指针将为您抓取并存储malloc'd空间。

答案 2 :(得分:0)

int arr [10];这个数组已经从堆栈中分配出来; 分配数组动态声明它作为指针 int * arr;

动态分配不会自动释放,免费或类似免费使用;