Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
molodoy_kolokol
0 / 0 / 0
Регистрация: 15.09.2016
Сообщений: 7
#1

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

15.09.2016, 12:37. Просмотров 741. Ответов 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? (C (СИ)):

Обязательно ли освобождать динамическую память в той же функции, где она была выделена? - C (СИ)
Подскажите, если я в какой-нибудь функции выделяю память, а потом выхожу из этой функции не использовав free. То это приводит к утечке...

Зачем выделять память с помощью malloc, а также с помощью new? - C (СИ)
Поясните пож. компилятор мингв. Работаю с массивом и ни как не могу понять как с ним работать правильно. Варианты: делал указатель и от...

Как правильно очистить память - C (СИ)
Пишу С-код... Выделяю память под массив строк так: char **Strings; Strings = malloc(StrsCount); for (i=0;i&lt;StrsCount;i++) { ...

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

Создать бесконечный двумерный массив с помощью malloc realloc - C (СИ)
Требуется создать бесконечный двумерный массив. С помощью malloc realloc. Идея такая: создаётся с помощью malloc массив из одного эл-та и в...

Ошибка при попытке очистить выделенную память - C (СИ)
#include &lt;stdio.h&gt; #include &lt;string.h&gt; #define MAX_WORDS 10 #define MAX_LENGTH 20 int ReadWords(char *pWords); void...

13
shvyrevvg
496 / 475 / 185
Регистрация: 12.05.2016
Сообщений: 1,387
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
496 / 475 / 185
Регистрация: 12.05.2016
Сообщений: 1,387
15.09.2016, 13:23 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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
496 / 475 / 185
Регистрация: 12.05.2016
Сообщений: 1,387
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
496 / 475 / 185
Регистрация: 12.05.2016
Сообщений: 1,387
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
496 / 475 / 185
Регистрация: 12.05.2016
Сообщений: 1,387
15.09.2016, 17:40 #10
molodoy_kolokol, забыл уточнить, memset() после free() делать нельзя.
0
easybudda
Модератор
Эксперт CЭксперт С++
10020 / 5943 / 1004
Регистрация: 25.07.2009
Сообщений: 11,230
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
5645 / 1962 / 373
Регистрация: 10.12.2010
Сообщений: 5,686
Записей в блоге: 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
Привет! Вот еще темы с ответами:

Нужно, чтобы память под массив выделялась не через: new — delete, а через оператор malloc (calloc) — free - C (СИ)
Ребят, есть программа, которая работает, но нужно, чтобы память под массив выделялась не через : new - delete, а через оператор...

В чем разница между malloc() и (char *)malloc() - C (СИ)
Прошу помочь разобраться: не могу понять в чем разница междуs=malloc(sizeof(char)); иs=(char *)malloc(sizeof(char));Буду признателен вашим...

Разделяемая память POSIX IPC как узнать, что память выделена и её уже можо использовать? - C Linux
1. Описание проблемы: Две программы. Одна пишет в разделяемую память, другая читает. Из-под читающей программы read невозможно понять...

Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc? - C++
Интересует данный вопрос. Можно ли и имеет ли вобще смысл например выделять память под объект класса с помощью функций calloc, malloc или...


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

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

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