Безопасно ли всегда перераспределять память перед ее освобождением - C ++ - PullRequest
0 голосов
/ 20 марта 2019

Предположим, что код такой:

#include <stdlib.h>

int main(int argc, char* argv[]) {
    int value = 42;
    void* pointer = (void*) &value;

    // Free stack memory
    free(pointer);

    return 0;
}

Этот код приводит к неопределенному поведению , поскольку он пытается освободить память в стеке.


Но мне было интересно;Как насчет перераспределения указателя каждый раз перед тем, как мы его освободим.

#include <stdlib.h>

int main(int argc, char* argv[]) {
    int value = 42;
    void* pointer = (void*) &value;

    // Allocate pointer on heap, then free memory
    pointer = realloc(pointer, sizeof pointer);
    free(pointer);

    return 0;
}

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

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


Запрос

Это безопасный способ гарантировать, что память освобождается должным образом или , это неправильно и создает объекты мусора, оставленные в памяти?

1 Ответ

13 голосов
/ 20 марта 2019

Вы не можете realloc складывать память - поэтому у вас все еще неопределенное поведение.

Страница man realloc (3) сообщит вам следующее:

Перераспределяет данноеобласть памяти.Он должен быть предварительно выделен функциями malloc (), calloc () или realloc () и еще не освобожден с помощью вызова free или realloc.В противном случае результаты не определены.

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