Форум программистов, компьютерный форум CyberForum.ru

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

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

C++ C++, операции с динамической памятью.
C++ программа с динамической памятью
C++ Работа с динамической памятью через указатели.
C++ Разобраться в принципе работы задачч. (Работа с динамической памятью через указатели. )
C++ Работа с динамической памятью через указатели. Загадочная ошибка.
Работа с динамической памятью через указатели. Загадочная ошибка. C++
строки: работа с динамической памятью, перегруженные конструкторы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16937 / 5342 / 328
Регистрация: 30.03.2009
Сообщений: 14,363
Записей в блоге: 26
06.06.2009, 13:09     Работа с динамической памятью! #2
В цикле вызываешь malloc по N килобайт и проверяешь результат. Если он равен NULL, значит доступной памяти больше нет. Все значение, которые тебе вернул malloc надо запомнить и когда память исчерпается - на каждое из значений вызвать free
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");
}
Пока пытаюсь просто кусок памяти выделить, а не в цикле пачками. В чем может быть проблема?
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.06.2009, 13:52     Работа с динамической памятью! #4
malloc выделяет память в байтах, а не килобайтах.
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
06.06.2009, 13:54  [ТС]     Работа с динамической памятью! #5
ну для этого и написано
C
1
dynamic_array = malloc(my_number * 1024);
или это не правильно? видел записи с участием sizeof(int) и т.д.
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.06.2009, 14:00     Работа с динамической памятью! #6
Пардоню, упустил. Вобще код верный, т.е. если malloc не вернул NULL, то память выделилась. Можно, конечно, еще попробовать выделять память в цикле на много проходов и смотреть что выдает система.
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
06.06.2009, 14:06  [ТС]     Работа с динамической памятью! #7
а есть функция, которая возвращает объем доступной памяти на данный момент?
и чем отличаются malloc и free от heapAlloc и heapFree?
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
06.06.2009, 14:07     Работа с динамической памятью! #8
убунтовая консоль, по-моему, не пойдет.
гарантии не дам, но помнится мне, что в убунте консоль - это обычный процесс.
и память там выделяется вплоть до виртуальной, т.е. через файл подкачки.
это в винде консоль - эмуляция машины дос. в убунте не так.
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
06.06.2009, 14:15  [ТС]     Работа с динамической памятью! #9
мм.. не совсем понял. Т.е. лучше под виндой эту прогу запускать и там проверять?
Тут-то памяти тоже не хватает, когда к примеру my_number = 9999999, выдает мой "Fatal Error!".
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
06.06.2009, 14:21     Работа с динамической памятью! #10
Цитата Сообщение от fba Посмотреть сообщение
my_number = 9999999
это получается... 10Гб.
процессору просто разрядности не хватает все это адресовать.
Цитата Сообщение от fba Посмотреть сообщение
лучше под виндой эту прогу запускать и там проверять
не "лучше", а "только".
преподы-же расчитывают на борланд. причем, чаще всего - версии 3.1 под дос.
можно еще попробовать WinX поднять, и на него поставить борланд.
в принципе, должен пойти...
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
06.06.2009, 14:25  [ТС]     Работа с динамической памятью! #11
хы.. ну да, с девятками я че-то перебрал)
окей, щас попробую это все перенести на винду. Потом отпишусь че и как)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16937 / 5342 / 328
Регистрация: 30.03.2009
Сообщений: 14,363
Записей в блоге: 26
06.06.2009, 14:48     Работа с динамической памятью! #12
malloc - выделяет тебе память, т.е. в таблице страниц отмечает, что у тебя есть в этом процессе такие-то виртуальные адреса и не боле того. А вот когда ты туда начнёшь что-нибудь записываьт - в это время у тебя начнут использоваться страницы физической памяти. Т.е. если тебе нужно "глазами" увидеть, что процесс жрёт физическую память, после выделения тебе надо заиспользовать память так, чтобы в кажой странице был записан хотябы один байт. Т.е. выделяешь кусками по 4 килобайта (размер аппаратной страницы памяти) и после кажлого выделения делаешь "*dynamic_array=0". Но при этом в твоей программе память сразу же осовбодится (даже если в цикле, то процесс пройдёт довольно быстро) и из соседней консоли ты просто не успеешь ничего заметить. Поэтому когда память исчерпается - сделай sleep на несколько секунд
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
08.06.2009, 12:00  [ТС]     Работа с динамической памятью! #13
с этим вроде разобрался. Но вот еще назрел вопрос:
Как в Си правильно работать со временем? Замерить какой-то промежуток и т.д.?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16937 / 5342 / 328
Регистрация: 30.03.2009
Сообщений: 14,363
Записей в блоге: 26
08.06.2009, 12:31     Работа с динамической памятью! #14
http://swoolley.org/man.cgi/clock
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
08.06.2009, 12:53  [ТС]     Работа с динамической памятью! #15
мм.. а можно какой-нить небольшой пример? буду оч благодарен.
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
08.06.2009, 13:00     Работа с динамической памятью! #16
Пожалуйста Как можна подсчитать время работы алгоритма (части программы).
fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
08.06.2009, 13:10  [ТС]     Работа с динамической памятью! #17
Ооо! да, круто, спасибо)
Search..
08.06.2009, 13:11
  #18

Не по теме:

Ооо! да, пупсик ! ыы

fba
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
08.06.2009, 14:29  [ТС]     Работа с динамической памятью! #19
Товарищи, еще одна проблема.
Хочу создать динамический список, для выделяемых ячеек памяти(чтоб их можно было потом последовательно удалить). Но уже возникли ошибки в структуре:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdlib.h>
 
struct Node{
    int  count;
    Node *next;
};
typedef Node *PNode;
 
PNode Head;
 
int main(){
 
    return 0;
}
Ошибки следующие:
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’

в чем может быть проблема?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2009, 14:31     Работа с динамической памятью!
Еще ссылки по теме:

Ошибка с динамической памятью C++
Работа с динамической памятью. Ошибка в функции getline через посимвольный ввод C++
C++ Работа с динамической памятью
Работа с динамической памятью в цикле C++
Почему в данном случае работа с заранее выделенной памятью медленнее чем с динамической? C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16937 / 5342 / 328
Регистрация: 30.03.2009
Сообщений: 14,363
Записей в блоге: 26
08.06.2009, 14:31     Работа с динамической памятью! #20
Для Си надо строку 5 менять на "struct Node *next;". Поскольку тип с точки зрения Си называется "struct Node", а не "Node". Для Си++ слово struct можно опустить

Добавлено через 47 секунд
7-ю строку, соотвественно, "typedef struct Node *PNode;"

Хотя можно и "typedef Node* Node;"
Yandex
Объявления
08.06.2009, 14:31     Работа с динамической памятью!
Ответ Создать тему
Опции темы

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