Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
1

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

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

Привет! Такая задача: Необходимо выделить(по N Кб) и освободить всю динамическую память. Определить время выделения и освобождения, и объем памяти. Использовать функции: 1) malloc, free. 2) heapAlloc, heapFree.
Вообще я разбираюсь в программировании, но на С/С++ никогда ничего не писал. Помогите кто в курсе дел.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2009, 13:06
Ответы с готовыми решениями:

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

Работа с динамической памятью
Всем привет! Начинающий программист(около нескольких недель), сейчас пишу программы чисто для себя,...

Работа с динамической памятью
При вызове деструктора ошибка: "Ошибка C2227 выражение слева от "->next" должно указывать на тип...

Работа с динамической памятью
Корректно ли организованна работа с памятью? Функция workWith2DArray осуществляет некоторую работу,...

27
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
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, но её не становится ни меньше, ни больше. Есть подозрение, что код вообще не работает. Вот он сам:

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
576 / 570 / 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
ну для этого и написано
C
1
dynamic_array = malloc(my_number * 1024);
или это не правильно? видел записи с участием sizeof(int) и т.д.
0
576 / 570 / 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
2341 / 497 / 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
2341 / 497 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
06.06.2009, 14:21 10
Цитата Сообщение от fba Посмотреть сообщение
my_number = 9999999
это получается... 10Гб.
процессору просто разрядности не хватает все это адресовать.
Цитата Сообщение от fba Посмотреть сообщение
лучше под виндой эту прогу запускать и там проверять
не "лучше", а "только".
преподы-же расчитывают на борланд. причем, чаще всего - версии 3.1 под дос.
можно еще попробовать WinX поднять, и на него поставить борланд.
в принципе, должен пойти...
0
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
06.06.2009, 14:25  [ТС] 11
хы.. ну да, с девятками я че-то перебрал)
окей, щас попробую это все перенести на винду. Потом отпишусь че и как)
0
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
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
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
08.06.2009, 12:31 14
http://swoolley.org/man.cgi/clock
0
0 / 0 / 0
Регистрация: 06.06.2009
Сообщений: 14
08.06.2009, 12:53  [ТС] 15
мм.. а можно какой-нить небольшой пример? буду оч благодарен.
0
576 / 570 / 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
Товарищи, еще одна проблема.
Хочу создать динамический список, для выделяемых ячеек памяти(чтоб их можно было потом последовательно удалить). Но уже возникли ошибки в структуре:

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’

в чем может быть проблема?
0
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
08.06.2009, 14:31 20
Для Си надо строку 5 менять на "struct Node *next;". Поскольку тип с точки зрения Си называется "struct Node", а не "Node". Для Си++ слово struct можно опустить

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

Хотя можно и "typedef Node* Node;"
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2009, 14:31

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Работа структур с динамической памятью
Здравствуйте! Решил немного поэкспериментировать с тем чтобы положить структурную переменную в...

Работа с динамической памятью в цикле
Всем привет. Есть переменная data, созданная динамически На каждой итерации цикла в нее...

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

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


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

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

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