Кажется, переменная на основе стека не будет выпущена после функции - PullRequest
0 голосов
/ 13 ноября 2018

Я новичок в C.

Известно, что переменные в стековой памяти освобождаются после завершения функции.Но в моем тесте он не освобождается и память занимает.

Пример понятен:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

void run() {
    printf("Start test. Memory usage in task manager: 504KB \n");
    sleep(5);

    char buf1[3145728];
    memset(buf1, 'x', 3145728);
    printf("buf1 Present. Memory usage in task manager: 3.9MB \n");

    sleep(10);
    return;
}

int main() {
    run();

    printf("run() ends. But memory usage in task manager is still: 3.9MB \n");
    sleep(10);

    char buf2[3145728];
    memset(buf2, 'y', 3145728);
    printf("buf2 Present. Memory usage in task manager: 7.0MB \n");

    sleep(15);
    return 0;
}

Я думаю, использование памяти после функции run () должно вернуться к тому, что было первым, но кажется, что переменная не может быть освобождена и остается в памяти.

Я не прав?

Подробнее:

  • Я написал sleep, чтобы успеть взглянуть на диспетчер задач.Именно поэтому: -)

  • Я использовал lxtask в GNU/Linux для мониторинга использования памяти.Я использовал gcc компилятор.

1 Ответ

0 голосов
/ 13 ноября 2018

Во-первых, не слишком доверяйте менеджеру задач. Это не очень точно.

Другое дело, что у компилятора есть стратегия выделения, которая вам не полностью известна.

Известно, что переменные в стековой памяти освобождаются после завершения функции.

Что «известно», так это то, что вам не следует создавать ссылку на локальную переменную и сохранять / возвращать ее с вероятностью того, что она будет использована вне области.

Если вы зациклились на этой функции или создали другую функцию, которая потребляет примерно столько же стека (или меньше), и вы вызываете ее сразу после этого, вы заметите, что объем памяти не увеличивается.

Это потому, что время выполнения компилятора не будет автоматически изменять размер стека. Он просто сохраняет его в следующий раз (это разница между стеком размер и емкость ). Здесь нет "утечки памяти". Вы даже можете настроить исполняемый файл (на этапе компоновки и в Windows с помощью таких инструментов, как EDITBIN) для предварительного выделения всего стека при запуске, чтобы избежать изменения размера и перемещения памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...