Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
Топ:
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
Эволюция кровеносной системы позвоночных животных: Биологическая эволюция – необратимый процесс исторического развития живой природы...
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Интересное:
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Уполаживание и террасирование склонов: Если глубина оврага более 5 м необходимо устройство берм. Варианты использования оврагов для градостроительных целей...
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Дисциплины:
2023-01-02 | 19 |
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;
}
Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!