繁体   English   中英

从C中的堆栈释放内存

[英]Free memory from stack in C

只是想知道是否有一种方法可以在运行时释放或减少从堆栈分配的内存。 例如:

int num[10] = {1,2,3,4};

我可以在运行时释放6 * 4字节(假设int需要4个字节)吗?

在局部变量的末尾定义时,将回收局部变量使用的内存。 无法像动态分配的内存那样释放它们。

如果需要调整使用的内存量,请使用malloc / free分配内存:

int *num = malloc(NUM_BYTES);
...
int *tmp = realloc(num, NEW_NUM_BYTES);
if (tmp) num = tmp;
...
free(num);

我可以在运行时释放6 * 4字节(假设int需要4个字节)吗?

不能。自动(或静态)存储持续时间的对象在其生命周期中具有固定的大小,这由其声明确定。 如果要使用更少的空间,则声明一个较小的对象。

如果要专门声明一个小数组,直到运行时才知道它的大小,并且只想声明实际需要的大小,则可以选择使用可变长度数组。 VLA支持在C2011中是可选的,并且VLA会带来一些潜在的问题,而固定长度数组则不会,但是如果您可以接受,那么您可以这样做:

void count_to(unsigned char max) {
    int numbers[max];
    for (int i = 0; i < max; i++) {
        numbers[i] = i + 1;
    }

    // ...
}

请注意,VLA可能没有初始化程序,并且如果最终得到的VLA大于所考虑的数量,您可能会遇到麻烦(例如,堆栈溢出)。

您的主要选择是动态分配。 动态分配数组会增加代码,并且经常会有性能开销,这要求您确保释放分配的内存,但是所有符合要求的实现都支持它,并且它通常比VLA支持更大的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM