Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
Топ:
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Интересное:
Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Дисциплины:
2023-01-02 | 17 |
5.00
из
|
Заказать работу |
|
|
• Динамически распределяемая область памяти – это свободная область памяти, не используемая программой, операционной системой или другими программами (англ. heap – «куча»).
• С++ включает набора средств, позволяющих организовать работу с динамически выделяемой памятью: унаследованный от С и реализованный в С++.
• В программе не следует смешивать использование средств разных языков.
Управление динамической памятью
• Основу системы динамического распределения памяти в С составляют библиотечные функции calloc (), malloc (), realloc () и free ().
• Для работы с динамической памятью в С++ используют специальные операторы new и delete.
• Перед попыткой использовать распределенную память важно проверить, что возвращаемое значение не равно нулю.
Функция calloc()
void *calloc(size_t num, size_t size);
size – параметр, определяющий размер выделяемой области;
num – количество областей.
• Функция calloc () выделяет память, размер которой равен значению выражения num * size.
• Выделенная область памяти обнуляется.
• Функция calloc () возвращает указатель на первый байт выделенной области или NULL, если запрос на память выполнить нельзя.
Функция calloc()
• Тип void может быть переопределен для требуемого типа, т. е. для char, int, float, double.
double *ptr;
ptr = (double *)
(calloc(10, sizeof(double)));
if (!ptr) // условие логического отрицания
{printf("Out of memory. Press any key:\n");
_getch(); exit(1);
}
Функция calloc()
int * list;
list = (int *) calloc(3,sizeof(int));
* list =-244;
*(list+1)=15;
*(list+2)=-45;
…
free(list);
Функция malloc()
void *malloc (size_t size);
size – параметр, определяющий размер выделяемой области.
• Функция malloc () возвращает указатель на первый байт области памяти размера size или NULL, если запрос на память выполнить нельзя.
|
• Выделенная область памяти не инициализируется.
Функция malloc()
int *a;
If
((a=(int *)malloc(sizeof(int)))==NULL)
{
printf("Память для числа не выделена.");
exit(1);
}
*a=-244;
*a+=10;
free(a);
Функция realloc()
void *realloc(void *ptr, size_t size);
* ptr - указатель,
size –размер выделяемой области.
• Функция realloc () изменяет размер блока ранее выделенной памяти. Значение параметра size может быть больше или меньше, чем перераспределяемая область.
• Возвращает указатель на блок памяти, т.к. бывает необходимо переместить этот блок.
• Если новый размер памяти больше старого, дополнительное пространство не инициализируется.
Функция realloc()
Int input,n;
int count=0;
int *numbers = NULL;
int *more_numbers;
do {
printf ("Enter an integer value
(0 to end): ");
scanf ("%d", &input);
count++;
more_numbers = (int*)
realloc(numbers,count * sizeof(int));
Функция realloc()
if (more_numbers!=NULL) {
numbers=more_numbers;
numbers[count-1]=input; }
else {
free (numbers);
puts ("Error (re)allocating memory");
exit (1); }
} while (input!=0);
printf ("Numbers entered: ");
for (n=0;n<count;n++)
printf ("%d ",numbers[n]);
Функция free()
void free(void *ptr);
ptr – параметр, определяющий адрес освобождаемого блока памяти.
• Функция free () возвращает в динамически распределяемую область памяти блок, после чего эта память становится доступной для выделения в будущем.
• Вызов функции free () должен выполняться только с указателем, который был получен ранее в результате вызова одной из функций динамического распределения памяти.
Функция free()
#include <stdio.h>
#include <stdlib.h>
int main () {
int *buf1, *buf2, *buf3;
buf1 = (int*) malloc(100*sizeof(int));
buf2 = (int*) calloc(100,sizeof(int));
buf3=(int*)realloc(buf2,50*sizeof(int));
free (buf1);
free (buf3);
return 0;
}
Операторы new и delete
• Выделение памяти под одно значение:
<Типизированный указатель> =
new <Тип>[(<Значение>)];
<Тип> – тип значения, под размещение которого выделяется память – определяет размер памяти, выделяемый данным оператором;
<Значение> – инициализирующее значение.
|
• Освобождение памяти, выделенной под одно значение:
delete <Типизированный указатель>;
Операторы new и delete
• Выделение памяти под несколько значений:
< Указатель > = new< Тип >[< Количество >];
<Тип> – тип значения, под размещение которого выделяется память – определяет размер памяти, выделяемый данным оператором;
<Количество> – количество значений, которое необходимо разместить в памяти.
Операторы new и delete
• Освобождение памяти, выделенной под несколько значений.
delete[] <Типизированный указатель>;
Квадратные скобки присутствуют в операторе и указывают, что освобождается несколько значений, память под которые отводилась одним оператором new:
Операторы new и delete
int *k;
k = new int;
*k = 85;
delete k;
int *a;
if ((a = new int(-244))==NULL) {
printf("Память для числа не выделена.");
exit(1);
}
delete a;
Операторы new и delete
short *list;
list = new short[3];
*list=-244;
*(list+1)=15;
*(list+2)=-45;
delete[] list;
Операторы new и delete
int i,n; int *p;
cout << "How many numbers would you like to type? ";
cin >> i;
p = new int[i];
if (p == 0) cout << "Error: memory could not be allocated";
else {
for (n=0; n<i; n++) {
cout << "Enter number: ";
cin >> p[n];
}
cout << "You have entered: ";
for (n=0; n<i; n++) cout << p[n] << ", ";
delete[] p;
}
|
|
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...
Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!