簡體   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