С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
molodoy_kolokol
0 / 0 / 0
Регистрация: 15.09.2016
Сообщений: 7
1

Как корректно очистить память, которая была выделена с помощью malloc?

15.09.2016, 12:37. Просмотров 1104. Ответов 13

Добрый день.
Как корректно очистить память, которая была выделена с помощью malloc? Приведу код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void print_array(int *a, int n)
{
    for(int i = 0; i < n; i++) {
        printf("%d", *(a+i));
    }
    printf("\n");
}
 
int main(int argc, char **argv) {
    printf("Привет\n");
    //наш массив
    int *a;
    //размер массива
    int n;
    //введём размер массива
    scanf("%d", &n);
    //выделим динамически память под массив
    a = (int*) malloc(n * sizeof(*a));
    
    for(int i = 0; i < n; i++) {
        *(a+i) = i;
    }
    
    print_array(a, n);  
 
    free(a);
 
    print_array(a, n);
    return 0;
}
Если начать работать с программой, то мы получим следующее:
Привет
4
0123
0023

Вопрос: почему после free(a) выводится 0023? Что случилось со значением "1", почему не изменились другие значения?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2016, 12:37
Ответы с готовыми решениями:

Обязательно ли освобождать динамическую память в той же функции, где она была выделена?
Подскажите, если я в какой-нибудь функции выделяю память, а потом выхожу из...

Зачем выделять память с помощью malloc, а также с помощью new?
Поясните пож. компилятор мингв. Работаю с массивом и ни как не могу понять как...

Как free освобождает память, выделенную через malloc?
Как функция free(void*) освобождает память выделенную malloc(). Если в malloc...

Как правильно очистить память
Пишу С-код... Выделяю память под массив строк так: char **Strings; Strings...

Не освобождается память от malloc
wchar_t* path; wchar_t* _path = L&quot;\dasdasdaev\dfg&quot;; if(!_path) return...

13
shvyrevvg
563 / 527 / 266
Регистрация: 12.05.2016
Сообщений: 1,529
15.09.2016, 12:58 2
Цитата Сообщение от molodoy_kolokol Посмотреть сообщение
Вопрос: почему после free(a) выводится 0023? Что случилось со значением "1", почему не изменились другие значения?
free() не обнуляет данные, она освобождает память по указанному указателю(после free() этой памятью могу пользоваться другие программы)

Добавлено через 6 минут
Если нужно просто обнулить данные, то это можно сделать функцией memset(), хотя проще перезаписывать.
1
molodoy_kolokol
0 / 0 / 0
Регистрация: 15.09.2016
Сообщений: 7
15.09.2016, 13:16  [ТС] 3
shvyrevvg, спасибо. Как корректно обнулить
Код
a = 0;
или
Код
*a = 0;
?
0
shvyrevvg
563 / 527 / 266
Регистрация: 12.05.2016
Сообщений: 1,529
15.09.2016, 13:23 4
Лучший ответ Сообщение было отмечено molodoy_kolokol как решение

Решение

Цитата Сообщение от molodoy_kolokol Посмотреть сообщение
Как корректно обнулить
Обнулить что? Если указатель, то просто a=NULL после free, если данные, то memset() или в цикле как вы заполняли только нулями .
1
molodoy_kolokol
0 / 0 / 0
Регистрация: 15.09.2016
Сообщений: 7
15.09.2016, 16:28  [ТС] 5
shvyrevvg, то есть лучше в таких ситуациях использовать вот такое решение? Чтобы уж наверняка после себя ничего не оставить:
Код
	free(a);
	memset(a, 0, sizeof(a));
	a = NULL;
0
shvyrevvg
563 / 527 / 266
Регистрация: 12.05.2016
Сообщений: 1,529
15.09.2016, 17:00 6
molodoy_kolokol, если дальше с массивом не будете работать, просто free(). a = NULL делается чтобы Вы сами после free() случайно в уже не вашу память не полезли. А memset() если нужно данные обнулить(ну нужно Вам, чтобы был массив заполнен нулями).
0
molodoy_kolokol
0 / 0 / 0
Регистрация: 15.09.2016
Сообщений: 7
15.09.2016, 17:11  [ТС] 7
shvyrevvg, да, это я понимаю) Последний вопрос: правильно ли я передаю в моем случае третий аргумент в функцию memset ?
0
shvyrevvg
563 / 527 / 266
Регистрация: 12.05.2016
Сообщений: 1,529
15.09.2016, 17:21 8
Цитата Сообщение от molodoy_kolokol Посмотреть сообщение
Последний вопрос: правильно ли я передаю в моем случае третий аргумент в функцию memset
Третий аргумент количество байт области памяти, вы же передаете размер указателя. Получается нужно так sizeof(тип данных)*размер массива
1
molodoy_kolokol
0 / 0 / 0
Регистрация: 15.09.2016
Сообщений: 7
15.09.2016, 17:26  [ТС] 9
shvyrevvg, спасибо.
0
shvyrevvg
563 / 527 / 266
Регистрация: 12.05.2016
Сообщений: 1,529
15.09.2016, 17:40 10
molodoy_kolokol, забыл уточнить, memset() после free() делать нельзя.
0
easybudda
Модератор
Эксперт CЭксперт С++
10156 / 6060 / 1525
Регистрация: 25.07.2009
Сообщений: 11,484
16.09.2016, 01:40 11
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

molodoy_kolokol, какая Вам разница, что остаётся в памяти, возвращённой системе вызовом free(). Использовать указатель на эту область памяти всё равно нельзя - фактически там может что угодно находиться.
C
1
2
3
4
5
6
7
8
9
10
int * arrayPointer;
size_t arraySize;
/* как-то получаем необходимый размер массива */
arrayPointer = malloc(sizeof(*arrayPointer) * arraySize);
if ( arrayPointer == NULL ) {
    /* ошибка выделения памяти, скорее всего нужно прервать программу */
}
/* как-то используем выделенную память... */
free(arrayPointer); /* с этого момента значение переменной arrayPointer считается недействительным */
arrayPointer = NULL; /* а это исключительно для того, что при попытке использовать память по адресу в указателе arrayPointer без повторной его инициализации получите NullPointerException, что в общем случае лучше, чем программа, продолжающая работать со случайными данными, как с осмысленными. */
0
molodoy_kolokol
0 / 0 / 0
Регистрация: 15.09.2016
Сообщений: 7
19.09.2016, 11:06  [ТС] 12
easybudda, я читал Хабру, а если в этой памяти остался пароль? Злоумышленник может воспользоваться неочищенной памятью.
0
HighPredator
5689 / 2008 / 723
Регистрация: 10.12.2010
Сообщений: 5,774
Записей в блоге: 3
19.09.2016, 11:25 13
molodoy_kolokol, ну если вы читали хабр, то и способы защититься тоже должны были там увидеть
0
molodoy_kolokol
0 / 0 / 0
Регистрация: 15.09.2016
Сообщений: 7
19.09.2016, 12:33  [ТС] 14
HighPredator, дело в том, что я прочитал хабр после того, как задал данный вопрос =) Поделились товарищи с другого сайта.
0
19.09.2016, 12:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2016, 12:33

Сделать проверку, выделил ли malloc память
Добрый день! Нужна помощь по коду: в строках (34, 45 и 48), где я использовал...

Создать бесконечный двумерный массив с помощью malloc realloc
Требуется создать бесконечный двумерный массив. С помощью malloc realloc. Идея...

Ошибка при попытке очистить выделенную память
#include &lt;stdio.h&gt; #include &lt;string.h&gt; #define MAX_WORDS 10 #define...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru