Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 15.09.2017
Сообщений: 19
1

Как правильно освободить память двумерного массива

08.01.2018, 17:52. Показов 1939. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Память для test выделена так:
C
1
2
char **test;
test = (char **)calloc(n, sizeof(char *));
Чтобы потом ее всю освободить, достаточно сделать free(test) или нужно в цикле free(test[i]) прогонять n раз?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2018, 17:52
Ответы с готовыми решениями:

Правильно выделить и освободить память
Помогите,пожалуйста, правильно выделить и освободить память. Чтобы не было утечек памяти. ...

Освободить память от двумерного динамического массива
помогите, пожалуйста, разобраться с очисткой динамического массива.Спасибо....

Не получается освободить память динамического двумерного массива
Пишу в Visual Studio 2015 Community Объявляю двумерный динамический массив так: int **mas =...

Как правильно освободить память
Есть функция char* md5(const char*). Как освободить память выделенную ею? #include <openssl\md5.h>...

8
14 / 14 / 7
Регистрация: 05.01.2018
Сообщений: 30
08.01.2018, 17:59 2
тут память выделиться не для двух мерного массива а для одномерного
0
4241 / 2938 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
08.01.2018, 18:17 3
То есть, освобождать можно free(test)
0
1 / 1 / 0
Регистрация: 15.09.2017
Сообщений: 19
08.01.2018, 18:27  [ТС] 4
Сейчас попробовал вот такое
C
1
2
3
4
5
6
7
8
    char **test;
    test = (char **)calloc(10, sizeof(char *));
    test[1] = "this is a test1";
    free(test);
    test[2] = "this is a test2";
    
    printf("%s\n", test[1]);
    printf("%s\n", test[2]);
Почему printf напечатал все содержимое, несмотря на free(test)? Под строки "this is a test" еще дополнительно память выделяется автоматически?
0
4241 / 2938 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
08.01.2018, 18:39 5
Лучший ответ Сообщение было отмечено gesegagaf как решение

Решение

Цитата Сообщение от gesegagaf Посмотреть сообщение
Почему printf напечатал все содержимое, несмотря на free(test)?
Потому что эта память оказалась еще не испорчена после free. Но гарантий, что она не будет испорчена, нет.
Цитата Сообщение от gesegagaf Посмотреть сообщение
Под строки "this is a test" еще дополнительно память выделяется автоматически?
Нет не выделяется. Вы запоминаете адрес константной строки в выделенной памяти, а не размножаете строку.
0
1 / 1 / 0
Регистрация: 15.09.2017
Сообщений: 19
08.01.2018, 18:57  [ТС] 6
Цитата Сообщение от palva Посмотреть сообщение
Потому что эта память оказалась еще не испорчена после free.
Вот оно что. Мне бы хотелось, чтобы после free нельзя было получить ее неиспорченное содержимое. Это надо через memset() забивать нулями или есть способ получше?
0
4241 / 2938 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
08.01.2018, 19:15 7
Цитата Сообщение от gesegagaf Посмотреть сообщение
Это надо через memset() забивать нулями или есть способ получше?
Если вы боретесь против шпионов, то лучше забивать ее дезинформацией.
0
1 / 1 / 0
Регистрация: 15.09.2017
Сообщений: 19
08.01.2018, 19:35  [ТС] 8
palva, дело не столько в шпионах, сколько в затрудненном отлавливании ошибок при сохраняющемся содержимом памяти. Вобщем, разобрался.
0
4241 / 2938 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
08.01.2018, 20:32 9
Цитата Сообщение от gesegagaf Посмотреть сообщение
сколько в затрудненном отлавливании ошибок при сохраняющемся содержимом памяти
Тогда заполняйте специальной сигнатурой, например байтами 0x35. Будет понятно, что это освобожденная память. А calloc ее снова очистит.
Но менеджер памяти может ее использовать в своих целях для разной служебной информации.
0
08.01.2018, 20:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2018, 20:32
Помогаю со студенческими работами здесь

Как правильно освободить память
Здравствуйте все! Подскажите, как правильно освобождать память, выделенную под массив оператором...

Как правильно освободить память
Написал вот такой костыль: wchar_t* getDate() { time_t seconds = time(NULL); tm timeinfo =...

Как правильно освободить память
Здрасте! (Тема: Шаблоны функций.) Не могу правильно написать метод для освобождения памяти. В...

Как правильно освободить память в QHash?
Добрый день. Не могу разобраться с парой вопросов. Выделяю память под объект Client, потом этот...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru