0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
|
|
1 | |
Работа с динамической памятью!06.06.2009, 13:06. Показов 4539. Ответов 27
Метки нет (Все метки)
Привет! Такая задача: Необходимо выделить(по N Кб) и освободить всю динамическую память. Определить время выделения и освобождения, и объем памяти. Использовать функции: 1) malloc, free. 2) heapAlloc, heapFree.
Вообще я разбираюсь в программировании, но на С/С++ никогда ничего не писал. Помогите кто в курсе дел.
0
|
06.06.2009, 13:06 | |
Ответы с готовыми решениями:
27
Работа с динамической памятью Работа с динамической памятью Работа с динамической памятью Работа с динамической памятью |
06.06.2009, 13:09 | 2 |
В цикле вызываешь malloc по N килобайт и проверяешь результат. Если он равен NULL, значит доступной памяти больше нет. Все значение, которые тебе вернул malloc надо запомнить и когда память исчерпается - на каждое из значений вызвать free
0
|
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
|
||||||
06.06.2009, 13:49 [ТС] | 3 | |||||
ну да, общий принцип понятен. Просто я боюсь, что у меня по синтаксису что-то не так. Поскольку работаю в убунте, и проверяю объем памяти из консоли командой free, но её не становится ни меньше, ни больше. Есть подозрение, что код вообще не работает. Вот он сам:
0
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
06.06.2009, 13:52 | 4 |
malloc выделяет память в байтах, а не килобайтах.
0
|
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
|
||||||
06.06.2009, 13:54 [ТС] | 5 | |||||
ну для этого и написано
0
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
06.06.2009, 14:00 | 6 |
Пардоню, упустил. Вобще код верный, т.е. если malloc не вернул NULL, то память выделилась. Можно, конечно, еще попробовать выделять память в цикле на много проходов и смотреть что выдает система.
0
|
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
|
|
06.06.2009, 14:06 [ТС] | 7 |
а есть функция, которая возвращает объем доступной памяти на данный момент?
и чем отличаются malloc и free от heapAlloc и heapFree?
0
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
|
06.06.2009, 14:07 | 8 |
убунтовая консоль, по-моему, не пойдет.
гарантии не дам, но помнится мне, что в убунте консоль - это обычный процесс. и память там выделяется вплоть до виртуальной, т.е. через файл подкачки. это в винде консоль - эмуляция машины дос. в убунте не так.
0
|
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
|
|
06.06.2009, 14:15 [ТС] | 9 |
мм.. не совсем понял. Т.е. лучше под виндой эту прогу запускать и там проверять?
Тут-то памяти тоже не хватает, когда к примеру my_number = 9999999, выдает мой "Fatal Error!".
0
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
|
06.06.2009, 14:21 | 10 |
это получается... 10Гб.
процессору просто разрядности не хватает все это адресовать. не "лучше", а "только". преподы-же расчитывают на борланд. причем, чаще всего - версии 3.1 под дос. можно еще попробовать WinX поднять, и на него поставить борланд. в принципе, должен пойти...
0
|
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
|
|
06.06.2009, 14:25 [ТС] | 11 |
хы.. ну да, с девятками я че-то перебрал)
окей, щас попробую это все перенести на винду. Потом отпишусь че и как)
0
|
06.06.2009, 14:48 | 12 |
malloc - выделяет тебе память, т.е. в таблице страниц отмечает, что у тебя есть в этом процессе такие-то виртуальные адреса и не боле того. А вот когда ты туда начнёшь что-нибудь записываьт - в это время у тебя начнут использоваться страницы физической памяти. Т.е. если тебе нужно "глазами" увидеть, что процесс жрёт физическую память, после выделения тебе надо заиспользовать память так, чтобы в кажой странице был записан хотябы один байт. Т.е. выделяешь кусками по 4 килобайта (размер аппаратной страницы памяти) и после кажлого выделения делаешь "*dynamic_array=0". Но при этом в твоей программе память сразу же осовбодится (даже если в цикле, то процесс пройдёт довольно быстро) и из соседней консоли ты просто не успеешь ничего заметить. Поэтому когда память исчерпается - сделай sleep на несколько секунд
1
|
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
|
|
08.06.2009, 12:00 [ТС] | 13 |
с этим вроде разобрался. Но вот еще назрел вопрос:
Как в Си правильно работать со временем? Замерить какой-то промежуток и т.д.?
0
|
08.06.2009, 12:31 | 14 |
0
|
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
|
|
08.06.2009, 12:53 [ТС] | 15 |
мм.. а можно какой-нить небольшой пример? буду оч благодарен.
0
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
08.06.2009, 13:00 | 16 |
1
|
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
|
|
08.06.2009, 13:10 [ТС] | 17 |
Ооо! да, круто, спасибо)
0
|
Search..
|
08.06.2009, 13:11
#18
|
Не по теме: Ооо! да, пупсик ! ыы
0
|
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
|
||||||
08.06.2009, 14:29 [ТС] | 19 | |||||
Товарищи, еще одна проблема.
Хочу создать динамический список, для выделяемых ячеек памяти(чтоб их можно было потом последовательно удалить). Но уже возникли ошибки в структуре:
task2.c:5: error: expected specifier-qualifier-list before ‘Node’ task2.c:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token task2.c:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘Head’ в чем может быть проблема?
0
|
08.06.2009, 14:31 | 20 |
Для Си надо строку 5 менять на "struct Node *next;". Поскольку тип с точки зрения Си называется "struct Node", а не "Node". Для Си++ слово struct можно опустить
Добавлено через 47 секунд 7-ю строку, соотвественно, "typedef struct Node *PNode;" Хотя можно и "typedef Node* Node;"
0
|
08.06.2009, 14:31 | |
08.06.2009, 14:31 | |
Помогаю со студенческими работами здесь
20
Работа структур с динамической памятью Работа с динамической памятью в цикле Работа с динамической памятью через указатели. Строки: работа с динамической памятью, перегруженные конструкторы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |