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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
#1

Работа с динамической памятью! - C++

06.06.2009, 13:06. Просмотров 2637. Ответов 27
Метки нет (Все метки)

Привет! Такая задача: Необходимо выделить(по N Кб) и освободить всю динамическую память. Определить время выделения и освобождения, и объем памяти. Использовать функции: 1) malloc, free. 2) heapAlloc, heapFree.
Вообще я разбираюсь в программировании, но на С/С++ никогда ничего не писал. Помогите кто в курсе дел.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2009, 13:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с динамической памятью! (C++):

Работа с динамической памятью - C++
Привет всем. Я недавно начал изучать C++ и наткнулся на ошибку:"двумерный динам.exe вызвал срабатывание точки останова" при очистке...

Работа с динамической памятью в цикле - C++
Всем привет. Есть переменная data, созданная динамически На каждой итерации цикла в нее записывается информация char* data =...

Работа с динамической памятью через указатели. - C++
Пишу в Microsoft Visual Studio ->Win32 Console application ->C++. Есть такая задача: Создать массив из N целых чисел, N вводит...

строки: работа с динамической памятью, перегруженные конструкторы - C++
Привет! Есть задача: Разработать класс String, который в дальнейшем будет использоваться для работы со строками. Класс должен...

Работа с динамической памятью через указатели. Загадочная ошибка. - C++
Пишу в Microsoft Visual Studio ->Win32 Console application ->C++. Есть такая задача: Создать массив из N целых чисел, N вводит...

Работа с динамической памятью через указатели. Загадочная ошибка. - C++
Программа запускается и нормально исполняется, но в конце появляется ошибка. Мог бы кто подсказать в чем проблема? Пишу в Microsoft...

27
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,665
Записей в блоге: 28
06.06.2009, 13:09 #2
В цикле вызываешь malloc по N килобайт и проверяешь результат. Если он равен NULL, значит доступной памяти больше нет. Все значение, которые тебе вернул malloc надо запомнить и когда память исчерпается - на каждое из значений вызвать free
0
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
06.06.2009, 13:49  [ТС] #3
ну да, общий принцип понятен. Просто я боюсь, что у меня по синтаксису что-то не так. Поскольку работаю в убунте, и проверяю объем памяти из консоли командой free, но её не становится ни меньше, ни больше. Есть подозрение, что код вообще не работает. Вот он сам:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdlib.h>
 
void main(){
    int ggg = 0;
    char *dynamic_array;
    int my_number = 1000;
 
    printf("=====  Begin (выделяем по %d Кб)  =====\n", my_number);
 
    dynamic_array = malloc(my_number * 1024);
    if(!dynamic_array){
        printf(">>>>> Fatal Error !!! <<<<<\n");
    }
    
    scanf("%d", &ggg);
    
    free(dynamic_array);
    dynamic_array = NULL;
 
    printf("=====  End  =====\n");
}
Пока пытаюсь просто кусок памяти выделить, а не в цикле пачками. В чем может быть проблема?
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.06.2009, 13:52 #4
malloc выделяет память в байтах, а не килобайтах.
0
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
06.06.2009, 13:54  [ТС] #5
ну для этого и написано
C
1
dynamic_array = malloc(my_number * 1024);
или это не правильно? видел записи с участием sizeof(int) и т.д.
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.06.2009, 14:00 #6
Пардоню, упустил. Вобще код верный, т.е. если malloc не вернул NULL, то память выделилась. Можно, конечно, еще попробовать выделять память в цикле на много проходов и смотреть что выдает система.
0
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
06.06.2009, 14:06  [ТС] #7
а есть функция, которая возвращает объем доступной памяти на данный момент?
и чем отличаются malloc и free от heapAlloc и heapFree?
0
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
06.06.2009, 14:07 #8
убунтовая консоль, по-моему, не пойдет.
гарантии не дам, но помнится мне, что в убунте консоль - это обычный процесс.
и память там выделяется вплоть до виртуальной, т.е. через файл подкачки.
это в винде консоль - эмуляция машины дос. в убунте не так.
0
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
06.06.2009, 14:15  [ТС] #9
мм.. не совсем понял. Т.е. лучше под виндой эту прогу запускать и там проверять?
Тут-то памяти тоже не хватает, когда к примеру my_number = 9999999, выдает мой "Fatal Error!".
0
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
06.06.2009, 14:21 #10
Цитата Сообщение от fba Посмотреть сообщение
my_number = 9999999
это получается... 10Гб.
процессору просто разрядности не хватает все это адресовать.
Цитата Сообщение от fba Посмотреть сообщение
лучше под виндой эту прогу запускать и там проверять
не "лучше", а "только".
преподы-же расчитывают на борланд. причем, чаще всего - версии 3.1 под дос.
можно еще попробовать WinX поднять, и на него поставить борланд.
в принципе, должен пойти...
0
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
06.06.2009, 14:25  [ТС] #11
хы.. ну да, с девятками я че-то перебрал)
окей, щас попробую это все перенести на винду. Потом отпишусь че и как)
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,665
Записей в блоге: 28
06.06.2009, 14:48 #12
malloc - выделяет тебе память, т.е. в таблице страниц отмечает, что у тебя есть в этом процессе такие-то виртуальные адреса и не боле того. А вот когда ты туда начнёшь что-нибудь записываьт - в это время у тебя начнут использоваться страницы физической памяти. Т.е. если тебе нужно "глазами" увидеть, что процесс жрёт физическую память, после выделения тебе надо заиспользовать память так, чтобы в кажой странице был записан хотябы один байт. Т.е. выделяешь кусками по 4 килобайта (размер аппаратной страницы памяти) и после кажлого выделения делаешь "*dynamic_array=0". Но при этом в твоей программе память сразу же осовбодится (даже если в цикле, то процесс пройдёт довольно быстро) и из соседней консоли ты просто не успеешь ничего заметить. Поэтому когда память исчерпается - сделай sleep на несколько секунд
1
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
08.06.2009, 12:00  [ТС] #13
с этим вроде разобрался. Но вот еще назрел вопрос:
Как в Си правильно работать со временем? Замерить какой-то промежуток и т.д.?
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,665
Записей в блоге: 28
08.06.2009, 12:31 #14
http://swoolley.org/man.cgi/clock
0
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
08.06.2009, 12:53  [ТС] #15
мм.. а можно какой-нить небольшой пример? буду оч благодарен.
0
08.06.2009, 12:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2009, 12:53
Привет! Вот еще темы с ответами:

Работа с динамической памятью. Ошибка в функции getline через посимвольный ввод - C++
Было дано вот такое задание: В этой задаче вам необходимо написать функцию getline, которая читает строку из стандартного потока ввода...

Разобраться в принципе работы задачч. (Работа с динамической памятью через указатели. ) - C++
Вот условие задачи: Создать массив из N целых чисел, N вводит пользователь. Заполнить массив случайным образом в диапазоне от 1 до 12....

Почему в данном случае работа с заранее выделенной памятью медленнее чем с динамической? - C++
Написал функцию которая на основе списка выделяет память и при каждом вызове возвращает указатель на следующий элемент для объекта. Код...

программа с динамической памятью - C++
текст программы #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iomanip&gt; #define m 12 using namespace...


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

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

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